﻿;(function (q) {
	if ("object" == typeof exports && "object" == typeof module) module.exports = q()
	else {
		if ("function" == typeof define && define.amd) return define([], q)
		this.CodeMirror = q()
	}
})(function () {
	function q(a, b) {
		if (!(this instanceof q)) return new q(a, b)
		this.options = b = b ? V(b) : {}
		V(qf, b, !1)
		wc(b)
		var c = b.value
		"string" == typeof c && (c = new P(c, b.mode))
		this.doc = c
		var d = new q.inputStyles[b.inputStyle](this),
			d = (this.display = new rf(a, c, d))
		d.wrapper.CodeMirror = this
		Ad(this)
		Bd(this)
		b.lineWrapping && (this.display.wrapper.className += " CodeMirror-wrap")
		b.autofocus && !ab && d.input.focus()
		Cd(this)
		this.state = { keyMaps: [], overlays: [], modeGen: 0, overwrite: !1, delayingBlurEvent: !1, focused: !1, suppressEdits: !1, pasteIncoming: !1, cutIncoming: !1, draggingText: !1, highlight: new bb(), keySeq: null, specialChars: null }
		var e = this
		B &&
			11 > C &&
			setTimeout(function () {
				e.display.input.reset(!0)
			}, 20)
		sf(this)
		Dd || (tf(), (Dd = !0))
		Ja(this)
		this.curOp.forceUpdate = !0
		Ed(this, c)
		;(b.autofocus && !ab) || e.hasFocus() ? setTimeout(cb(xc, this), 20) : db(this)
		for (var f in Ka) if (Ka.hasOwnProperty(f)) Ka[f](this, b[f], Fd)
		Gd(this)
		b.finishInit && b.finishInit(this)
		for (c = 0; c < yc.length; ++c) yc[c](this)
		La(this)
		J && b.lineWrapping && "optimizelegibility" == getComputedStyle(d.lineDiv).textRendering && (d.lineDiv.style.textRendering = "auto")
	}
	function rf(a, b, c) {
		this.input = c
		this.scrollbarFiller = t("div", null, "CodeMirror-scrollbar-filler")
		this.scrollbarFiller.setAttribute("cm-not-content", "true")
		this.gutterFiller = t("div", null, "CodeMirror-gutter-filler")
		this.gutterFiller.setAttribute("cm-not-content", "true")
		this.lineDiv = t("div", null, "CodeMirror-code")
		this.selectionDiv = t("div", null, null, "position: relative; z-index: 1")
		this.cursorDiv = t("div", null, "CodeMirror-cursors")
		this.measure = t("div", null, "CodeMirror-measure")
		this.lineMeasure = t("div", null, "CodeMirror-measure")
		this.lineSpace = t("div", [this.measure, this.lineMeasure, this.selectionDiv, this.cursorDiv, this.lineDiv], null, "position: relative; outline: none")
		this.mover = t("div", [t("div", [this.lineSpace], "CodeMirror-lines")], null, "position: relative")
		this.sizer = t("div", [this.mover], "CodeMirror-sizer")
		this.sizerWidth = null
		this.heightForcer = t("div", null, null, "position: absolute; height: " + Hd + "px; width: 1px;")
		this.gutters = t("div", null, "CodeMirror-gutters")
		this.lineGutter = null
		this.scroller = t("div", [this.sizer, this.heightForcer, this.gutters], "CodeMirror-scroll")
		this.scroller.setAttribute("tabIndex", "-1")
		this.wrapper = t("div", [this.scrollbarFiller, this.gutterFiller, this.scroller], "CodeMirror")
		B && 8 > C && ((this.gutters.style.zIndex = -1), (this.scroller.style.paddingRight = 0))
		J || (wa && ab) || (this.scroller.draggable = !0)
		a && (a.appendChild ? a.appendChild(this.wrapper) : a(this.wrapper))
		this.reportedViewFrom = this.reportedViewTo = this.viewFrom = this.viewTo = b.first
		this.view = []
		this.externalMeasured = this.renderedView = null
		this.lastWrapHeight = this.lastWrapWidth = this.viewOffset = 0
		this.updateLineNumbers = null
		this.nativeBarWidth = this.barHeight = this.barWidth = 0
		this.scrollbarsClipped = !1
		this.lineNumWidth = this.lineNumInnerWidth = this.lineNumChars = null
		this.alignWidgets = !1
		this.maxLine = this.cachedCharWidth = this.cachedTextHeight = this.cachedPaddingH = null
		this.maxLineLength = 0
		this.maxLineChanged = !1
		this.wheelDX = this.wheelDY = this.wheelStartX = this.wheelStartY = null
		this.shift = !1
		this.activeTouch = this.selForContextMenu = null
		c.init(this)
	}
	function zc(a) {
		a.doc.mode = q.getMode(a.options, a.doc.modeOption)
		eb(a)
	}
	function eb(a) {
		a.doc.iter(function (a) {
			a.stateAfter && (a.stateAfter = null)
			a.styles && (a.styles = null)
		})
		a.doc.frontier = a.doc.first
		fb(a, 100)
		a.state.modeGen++
		a.curOp && Q(a)
	}
	function Id(a) {
		var b = xa(a.display),
			c = a.options.lineWrapping,
			d = c && Math.max(5, a.display.scroller.clientWidth / gb(a.display) - 3)
		return function (e) {
			if (ya(a.doc, e)) return 0
			var f = 0
			if (e.widgets) for (var g = 0; g < e.widgets.length; g++) e.widgets[g].height && (f += e.widgets[g].height)
			return c ? f + (Math.ceil(e.text.length / d) || 1) * b : f + b
		}
	}
	function Ac(a) {
		var b = a.doc,
			c = Id(a)
		b.iter(function (a) {
			var b = c(a)
			b != a.height && ca(a, b)
		})
	}
	function Bd(a) {
		a.display.wrapper.className = a.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + a.options.theme.replace(/(^|\s)\s*/g, " cm-s-")
		hb(a)
	}
	function ib(a) {
		Ad(a)
		Q(a)
		setTimeout(function () {
			Bc(a)
		}, 20)
	}
	function Ad(a) {
		var b = a.display.gutters,
			c = a.options.gutters
		za(b)
		for (var d = 0; d < c.length; ++d) {
			var e = c[d],
				f = b.appendChild(t("div", null, "CodeMirror-gutter " + e))
			"CodeMirror-linenumbers" == e && ((a.display.lineGutter = f), (f.style.width = (a.display.lineNumWidth || 1) + "px"))
		}
		b.style.display = d ? "" : "none"
		Cc(a)
	}
	function Cc(a) {
		a.display.sizer.style.marginLeft = a.display.gutters.offsetWidth + "px"
	}
	function Kb(a) {
		if (0 == a.height) return 0
		for (var b = a.text.length, c, d = a; (c = Aa(d, !0)); ) (c = c.find(0, !0)), (d = c.from.line), (b += c.from.ch - c.to.ch)
		for (d = a; (c = Aa(d, !1)); ) (c = c.find(0, !0)), (b -= d.text.length - c.from.ch), (d = c.to.line), (b += d.text.length - c.to.ch)
		return b
	}
	function Dc(a) {
		var b = a.display
		a = a.doc
		b.maxLine = u(a, a.first)
		b.maxLineLength = Kb(b.maxLine)
		b.maxLineChanged = !0
		a.iter(function (a) {
			var d = Kb(a)
			d > b.maxLineLength && ((b.maxLineLength = d), (b.maxLine = a))
		})
	}
	function wc(a) {
		var b = D(a.gutters, "CodeMirror-linenumbers")
		;-1 == b && a.lineNumbers ? (a.gutters = a.gutters.concat(["CodeMirror-linenumbers"])) : -1 < b && !a.lineNumbers && ((a.gutters = a.gutters.slice(0)), a.gutters.splice(b, 1))
	}
	function jb(a) {
		var b = a.display,
			c = b.gutters.offsetWidth,
			d = Math.round(a.doc.height + Ec(a.display))
		return { clientHeight: b.scroller.clientHeight, viewHeight: b.wrapper.clientHeight, scrollWidth: b.scroller.scrollWidth, clientWidth: b.scroller.clientWidth, viewWidth: b.wrapper.clientWidth, barLeft: a.options.fixedGutter ? c : 0, docHeight: d, scrollHeight: d + da(a) + b.barHeight, nativeBarWidth: b.nativeBarWidth, gutterWidth: c }
	}
	function Fc(a, b, c) {
		this.cm = c
		var d = (this.vert = t("div", [t("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar")),
			e = (this.horiz = t("div", [t("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"))
		a(d)
		a(e)
		v(d, "scroll", function () {
			d.clientHeight && b(d.scrollTop, "vertical")
		})
		v(e, "scroll", function () {
			e.clientWidth && b(e.scrollLeft, "horizontal")
		})
		this.checkedOverlay = !1
		B && 8 > C && (this.horiz.style.minHeight = this.vert.style.minWidth = "18px")
	}
	function Gc() {}
	function Cd(a) {
		a.display.scrollbars && (a.display.scrollbars.clear(), a.display.scrollbars.addClass && kb(a.display.wrapper, a.display.scrollbars.addClass))
		a.display.scrollbars = new q.scrollbarModel[a.options.scrollbarStyle](
			function (b) {
				a.display.wrapper.insertBefore(b, a.display.scrollbarFiller)
				v(b, "mousedown", function () {
					a.state.focused &&
						setTimeout(function () {
							a.display.input.focus()
						}, 0)
				})
				b.setAttribute("cm-not-content", "true")
			},
			function (b, c) {
				"horizontal" == c ? Ma(a, b) : lb(a, b)
			},
			a
		)
		a.display.scrollbars.addClass && mb(a.display.wrapper, a.display.scrollbars.addClass)
	}
	function Na(a, b) {
		b || (b = jb(a))
		var c = a.display.barWidth,
			d = a.display.barHeight
		Jd(a, b)
		for (var e = 0; (4 > e && c != a.display.barWidth) || d != a.display.barHeight; e++) c != a.display.barWidth && a.options.lineWrapping && Lb(a), Jd(a, jb(a)), (c = a.display.barWidth), (d = a.display.barHeight)
	}
	function Jd(a, b) {
		var c = a.display,
			d = c.scrollbars.update(b)
		c.sizer.style.paddingRight = (c.barWidth = d.right) + "px"
		c.sizer.style.paddingBottom = (c.barHeight = d.bottom) + "px"
		d.right && d.bottom ? ((c.scrollbarFiller.style.display = "block"), (c.scrollbarFiller.style.height = d.bottom + "px"), (c.scrollbarFiller.style.width = d.right + "px")) : (c.scrollbarFiller.style.display = "")
		d.bottom && a.options.coverGutterNextToScrollbar && a.options.fixedGutter ? ((c.gutterFiller.style.display = "block"), (c.gutterFiller.style.height = d.bottom + "px"), (c.gutterFiller.style.width = b.gutterWidth + "px")) : (c.gutterFiller.style.display = "")
	}
	function Hc(a, b, c) {
		var d = c && null != c.top ? Math.max(0, c.top) : a.scroller.scrollTop,
			d = Math.floor(d - a.lineSpace.offsetTop),
			e = c && null != c.bottom ? c.bottom : d + a.wrapper.clientHeight,
			d = Ba(b, d),
			e = Ba(b, e)
		if (c && c.ensure) {
			var f = c.ensure.from.line
			c = c.ensure.to.line
			f < d ? ((d = f), (e = Ba(b, ea(u(b, f)) + a.wrapper.clientHeight))) : Math.min(c, b.lastLine()) >= e && ((d = Ba(b, ea(u(b, c)) - a.wrapper.clientHeight)), (e = c))
		}
		return { from: d, to: Math.max(e, d + 1) }
	}
	function Bc(a) {
		var b = a.display,
			c = b.view
		if (b.alignWidgets || (b.gutters.firstChild && a.options.fixedGutter)) {
			for (var d = Ic(b) - b.scroller.scrollLeft + a.doc.scrollLeft, e = b.gutters.offsetWidth, f = d + "px", g = 0; g < c.length; g++)
				if (!c[g].hidden) {
					a.options.fixedGutter && c[g].gutter && (c[g].gutter.style.left = f)
					var h = c[g].alignable
					if (h) for (var k = 0; k < h.length; k++) h[k].style.left = f
				}
			a.options.fixedGutter && (b.gutters.style.left = d + e + "px")
		}
	}
	function Gd(a) {
		if (!a.options.lineNumbers) return !1
		var b = a.doc,
			b = Jc(a.options, b.first + b.size - 1),
			c = a.display
		if (b.length != c.lineNumChars) {
			var d = c.measure.appendChild(t("div", [t("div", b)], "CodeMirror-linenumber CodeMirror-gutter-elt")),
				e = d.firstChild.offsetWidth,
				d = d.offsetWidth - e
			c.lineGutter.style.width = ""
			c.lineNumInnerWidth = Math.max(e, c.lineGutter.offsetWidth - d) + 1
			c.lineNumWidth = c.lineNumInnerWidth + d
			c.lineNumChars = c.lineNumInnerWidth ? b.length : -1
			c.lineGutter.style.width = c.lineNumWidth + "px"
			Cc(a)
			return !0
		}
		return !1
	}
	function Jc(a, b) {
		return String(a.lineNumberFormatter(b + a.firstLineNumber))
	}
	function Ic(a) {
		return a.scroller.getBoundingClientRect().left - a.sizer.getBoundingClientRect().left
	}
	function Mb(a, b, c) {
		var d = a.display
		this.viewport = b
		this.visible = Hc(d, a.doc, b)
		this.editorIsHidden = !d.wrapper.offsetWidth
		this.wrapperHeight = d.wrapper.clientHeight
		this.wrapperWidth = d.wrapper.clientWidth
		this.oldDisplayWidth = pa(a)
		this.force = c
		this.dims = Kc(a)
		this.events = []
	}
	function Lc(a, b) {
		var c = a.display,
			d = a.doc
		if (b.editorIsHidden) return qa(a), !1
		if (!b.force && b.visible.from >= c.viewFrom && b.visible.to <= c.viewTo && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo) && c.renderedView == c.view && 0 == Kd(a)) return !1
		Gd(a) && (qa(a), (b.dims = Kc(a)))
		var e = d.first + d.size,
			f = Math.max(b.visible.from - a.options.viewportMargin, d.first),
			g = Math.min(e, b.visible.to + a.options.viewportMargin)
		c.viewFrom < f && 20 > f - c.viewFrom && (f = Math.max(d.first, c.viewFrom))
		c.viewTo > g && 20 > c.viewTo - g && (g = Math.min(e, c.viewTo))
		ra && ((f = Mc(a.doc, f)), (g = Ld(a.doc, g)))
		d = f != c.viewFrom || g != c.viewTo || c.lastWrapHeight != b.wrapperHeight || c.lastWrapWidth != b.wrapperWidth
		e = a.display
		0 == e.view.length || f >= e.viewTo || g <= e.viewFrom ? ((e.view = Nb(a, f, g)), (e.viewFrom = f)) : (e.viewFrom > f ? (e.view = Nb(a, f, e.viewFrom).concat(e.view)) : e.viewFrom < f && (e.view = e.view.slice(Ca(a, f))), (e.viewFrom = f), e.viewTo < g ? (e.view = e.view.concat(Nb(a, e.viewTo, g))) : e.viewTo > g && (e.view = e.view.slice(0, Ca(a, g))))
		e.viewTo = g
		c.viewOffset = ea(u(a.doc, c.viewFrom))
		a.display.mover.style.top = c.viewOffset + "px"
		g = Kd(a)
		if (!d && 0 == g && !b.force && c.renderedView == c.view && (null == c.updateLineNumbers || c.updateLineNumbers >= c.viewTo)) return !1
		f = fa()
		4 < g && (c.lineDiv.style.display = "none")
		uf(a, c.updateLineNumbers, b.dims)
		4 < g && (c.lineDiv.style.display = "")
		c.renderedView = c.view
		f && fa() != f && f.offsetHeight && f.focus()
		za(c.cursorDiv)
		za(c.selectionDiv)
		c.gutters.style.height = 0
		d && ((c.lastWrapHeight = b.wrapperHeight), (c.lastWrapWidth = b.wrapperWidth), fb(a, 400))
		c.updateLineNumbers = null
		return !0
	}
	function Md(a, b) {
		for (var c = b.viewport, d = !0; ; d = !1) {
			if (!d || !a.options.lineWrapping || b.oldDisplayWidth == pa(a)) if ((c && null != c.top && (c = { top: Math.min(a.doc.height + Ec(a.display) - Nc(a), c.top) }), (b.visible = Hc(a.display, a.doc, c)), b.visible.from >= a.display.viewFrom && b.visible.to <= a.display.viewTo)) break
			if (!Lc(a, b)) break
			Lb(a)
			d = jb(a)
			nb(a)
			Oc(a, d)
			Na(a, d)
		}
		b.signal(a, "update", a)
		if (a.display.viewFrom != a.display.reportedViewFrom || a.display.viewTo != a.display.reportedViewTo) b.signal(a, "viewportChange", a, a.display.viewFrom, a.display.viewTo), (a.display.reportedViewFrom = a.display.viewFrom), (a.display.reportedViewTo = a.display.viewTo)
	}
	function Pc(a, b) {
		var c = new Mb(a, b)
		if (Lc(a, c)) {
			Lb(a)
			Md(a, c)
			var d = jb(a)
			nb(a)
			Oc(a, d)
			Na(a, d)
			c.finish()
		}
	}
	function Oc(a, b) {
		a.display.sizer.style.minHeight = b.docHeight + "px"
		var c = b.docHeight + a.display.barHeight
		a.display.heightForcer.style.top = c + "px"
		a.display.gutters.style.height = Math.max(c + da(a), b.clientHeight) + "px"
	}
	function Lb(a) {
		a = a.display
		for (var b = a.lineDiv.offsetTop, c = 0; c < a.view.length; c++) {
			var d = a.view[c],
				e
			if (!d.hidden) {
				if (B && 8 > C) {
					var f = d.node.offsetTop + d.node.offsetHeight
					e = f - b
					b = f
				} else (e = d.node.getBoundingClientRect()), (e = e.bottom - e.top)
				f = d.line.height - e
				2 > e && (e = xa(a))
				if (0.001 < f || -0.001 > f) if ((ca(d.line, e), Nd(d.line), d.rest)) for (e = 0; e < d.rest.length; e++) Nd(d.rest[e])
			}
		}
	}
	function Nd(a) {
		if (a.widgets) for (var b = 0; b < a.widgets.length; ++b) a.widgets[b].height = a.widgets[b].node.offsetHeight
	}
	function Kc(a) {
		for (var b = a.display, c = {}, d = {}, e = b.gutters.clientLeft, f = b.gutters.firstChild, g = 0; f; f = f.nextSibling, ++g) (c[a.options.gutters[g]] = f.offsetLeft + f.clientLeft + e), (d[a.options.gutters[g]] = f.clientWidth)
		return { fixedPos: Ic(b), gutterTotalWidth: b.gutters.offsetWidth, gutterLeft: c, gutterWidth: d, wrapperWidth: b.wrapper.clientWidth }
	}
	function uf(a, b, c) {
		function d(b) {
			var c = b.nextSibling
			J && W && a.display.currentWheelTarget == b ? (b.style.display = "none") : b.parentNode.removeChild(b)
			return c
		}
		for (var e = a.display, f = a.options.lineNumbers, g = e.lineDiv, h = g.firstChild, k = e.view, e = e.viewFrom, l = 0; l < k.length; l++) {
			var m = k[l]
			if (!m.hidden)
				if (m.node && m.node.parentNode == g) {
					for (; h != m.node; ) h = d(h)
					h = f && null != b && b <= e && m.lineNumber
					m.changes && (-1 < D(m.changes, "gutter") && (h = !1), Od(a, m, e, c))
					h && (za(m.lineNumber), m.lineNumber.appendChild(document.createTextNode(Jc(a.options, e))))
					h = m.node.nextSibling
				} else {
					var p = vf(a, m, e, c)
					g.insertBefore(p, h)
				}
			e += m.size
		}
		for (; h; ) h = d(h)
	}
	function Od(a, b, c, d) {
		for (var e = 0; e < b.changes.length; e++) {
			var f = b.changes[e]
			if ("text" == f) {
				var f = b,
					g = f.text.className,
					h = Pd(a, f)
				f.text == f.node && (f.node = h.pre)
				f.text.parentNode.replaceChild(h.pre, f.text)
				f.text = h.pre
				h.bgClass != f.bgClass || h.textClass != f.textClass ? ((f.bgClass = h.bgClass), (f.textClass = h.textClass), Qc(f)) : g && (f.text.className = g)
			} else if ("gutter" == f) Qd(a, b, c, d)
			else if ("class" == f) Qc(b)
			else if ("widget" == f) {
				f = a
				g = b
				h = d
				g.alignable && (g.alignable = null)
				for (var k = g.node.firstChild, l = void 0; k; k = l) (l = k.nextSibling), "CodeMirror-linewidget" == k.className && g.node.removeChild(k)
				Rd(f, g, h)
			}
		}
		b.changes = null
	}
	function Ob(a) {
		a.node == a.text && ((a.node = t("div", null, null, "position: relative")), a.text.parentNode && a.text.parentNode.replaceChild(a.node, a.text), a.node.appendChild(a.text), B && 8 > C && (a.node.style.zIndex = 2))
		return a.node
	}
	function Pd(a, b) {
		var c = a.display.externalMeasured
		return c && c.line == b.line ? ((a.display.externalMeasured = null), (b.measure = c.measure), c.built) : Sd(a, b)
	}
	function Qc(a) {
		var b = a.bgClass ? a.bgClass + " " + (a.line.bgClass || "") : a.line.bgClass
		b && (b += " CodeMirror-linebackground")
		if (a.background) b ? (a.background.className = b) : (a.background.parentNode.removeChild(a.background), (a.background = null))
		else if (b) {
			var c = Ob(a)
			a.background = c.insertBefore(t("div", null, b), c.firstChild)
		}
		a.line.wrapClass ? (Ob(a).className = a.line.wrapClass) : a.node != a.text && (a.node.className = "")
		a.text.className = (a.textClass ? a.textClass + " " + (a.line.textClass || "") : a.line.textClass) || ""
	}
	function Qd(a, b, c, d) {
		b.gutter && (b.node.removeChild(b.gutter), (b.gutter = null))
		var e = b.line.gutterMarkers
		if (a.options.lineNumbers || e) {
			var f = Ob(b),
				g = (b.gutter = t("div", null, "CodeMirror-gutter-wrapper", "left: " + (a.options.fixedGutter ? d.fixedPos : -d.gutterTotalWidth) + "px; width: " + d.gutterTotalWidth + "px"))
			a.display.input.setUneditable(g)
			f.insertBefore(g, b.text)
			b.line.gutterClass && (g.className += " " + b.line.gutterClass)
			!a.options.lineNumbers || (e && e["CodeMirror-linenumbers"]) || (b.lineNumber = g.appendChild(t("div", Jc(a.options, c), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + d.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + a.display.lineNumInnerWidth + "px")))
			if (e) for (b = 0; b < a.options.gutters.length; ++b) (c = a.options.gutters[b]), (f = e.hasOwnProperty(c) && e[c]) && g.appendChild(t("div", [f], "CodeMirror-gutter-elt", "left: " + d.gutterLeft[c] + "px; width: " + d.gutterWidth[c] + "px"))
		}
	}
	function vf(a, b, c, d) {
		var e = Pd(a, b)
		b.text = b.node = e.pre
		e.bgClass && (b.bgClass = e.bgClass)
		e.textClass && (b.textClass = e.textClass)
		Qc(b)
		Qd(a, b, c, d)
		Rd(a, b, d)
		return b.node
	}
	function Rd(a, b, c) {
		Td(a, b.line, b, c, !0)
		if (b.rest) for (var d = 0; d < b.rest.length; d++) Td(a, b.rest[d], b, c, !1)
	}
	function Td(a, b, c, d, e) {
		if (b.widgets) {
			var f = Ob(c),
				g = 0
			for (b = b.widgets; g < b.length; ++g) {
				var h = b[g],
					k = t("div", [h.node], "CodeMirror-linewidget")
				h.handleMouseEvents || k.setAttribute("cm-ignore-events", "true")
				var l = h,
					m = k,
					p = d
				if (l.noHScroll) {
					;(c.alignable || (c.alignable = [])).push(m)
					var n = p.wrapperWidth
					m.style.left = p.fixedPos + "px"
					l.coverGutter || ((n -= p.gutterTotalWidth), (m.style.paddingLeft = p.gutterTotalWidth + "px"))
					m.style.width = n + "px"
				}
				l.coverGutter && ((m.style.zIndex = 5), (m.style.position = "relative"), l.noHScroll || (m.style.marginLeft = -p.gutterTotalWidth + "px"))
				a.display.input.setUneditable(k)
				e && h.above ? f.insertBefore(k, c.gutter || c.text) : f.appendChild(k)
				L(h, "redraw")
			}
		}
	}
	function Rc(a) {
		return r(a.line, a.ch)
	}
	function Pb(a, b) {
		return 0 > y(a, b) ? b : a
	}
	function Qb(a, b) {
		return 0 > y(a, b) ? a : b
	}
	function Ud(a) {
		a.state.focused || (a.display.input.focus(), xc(a))
	}
	function Rb(a) {
		return a.options.readOnly || a.doc.cantEdit
	}
	function Sc(a, b, c, d, e) {
		var f = a.doc
		a.display.shift = !1
		d || (d = f.sel)
		var g = sa(b),
			h = null
		a.state.pasteIncoming &&
			1 < d.ranges.length &&
			(X && X.join("\n") == b
				? (h = 0 == d.ranges.length % X.length && ob(X, sa))
				: g.length == d.ranges.length &&
				  (h = ob(g, function (a) {
						return [a]
				  })))
		for (var k = d.ranges.length - 1; 0 <= k; k--) {
			var l = d.ranges[k],
				m = l.from(),
				p = l.to()
			l.empty() && (c && 0 < c ? (m = r(m.line, m.ch - c)) : a.state.overwrite && !a.state.pasteIncoming && (p = r(p.line, Math.min(u(f, p.line).text.length, p.ch + A(g).length))))
			var n = a.curOp.updateInput,
				m = { from: m, to: p, text: h ? h[k % h.length] : g, origin: e || (a.state.pasteIncoming ? "paste" : a.state.cutIncoming ? "cut" : "+input") }
			Oa(a.doc, m)
			L(a, "inputRead", a, m)
			if (b && !a.state.pasteIncoming && a.options.electricChars && a.options.smartIndent && 100 > l.head.ch && (!k || d.ranges[k - 1].head.line != l.head.line)) {
				l = a.getModeAt(l.head)
				m = ta(m)
				p = !1
				if (l.electricChars)
					for (var E = 0; E < l.electricChars.length; E++) {
						if (-1 < b.indexOf(l.electricChars.charAt(E))) {
							p = pb(a, m.line, "smart")
							break
						}
					}
				else l.electricInput && l.electricInput.test(u(f, m.line).text.slice(0, m.ch)) && (p = pb(a, m.line, "smart"))
				p && L(a, "electricInput", a, m.line)
			}
		}
		Pa(a)
		a.curOp.updateInput = n
		a.curOp.typing = !0
		a.state.pasteIncoming = a.state.cutIncoming = !1
	}
	function Vd(a) {
		for (var b = [], c = [], d = 0; d < a.doc.sel.ranges.length; d++) {
			var e = a.doc.sel.ranges[d].head.line,
				e = { anchor: r(e, 0), head: r(e + 1, 0) }
			c.push(e)
			b.push(a.getRange(e.anchor, e.head))
		}
		return { text: b, ranges: c }
	}
	function Wd(a) {
		a.setAttribute("autocorrect", "off")
		a.setAttribute("autocapitalize", "off")
		a.setAttribute("spellcheck", "false")
	}
	function Tc(a) {
		this.cm = a
		this.prevInput = ""
		this.pollingFast = !1
		this.polling = new bb()
		this.hasSelection = this.inaccurateSelection = !1
		this.composing = null
	}
	function Xd() {
		var a = t("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),
			b = t("div", [a], null, "overflow: hidden; position: relative; width: 3px; height: 0px;")
		J ? (a.style.width = "1000px") : a.setAttribute("wrap", "off")
		Qa && (a.style.border = "1px solid black")
		Wd(a)
		return b
	}
	function Uc(a) {
		this.cm = a
		this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null
		this.polling = new bb()
		this.gracePeriod = !1
	}
	function Yd(a, b) {
		var c = Vc(a, b.line)
		if (!c || c.hidden) return null
		var d = u(a.doc, b.line),
			c = Zd(c, d, b.line)
		;(d = Y(d)) && Sb(d, b.ch)
		d = $d(c.map, b.ch, "left")
		d.offset = "right" == d.collapse ? d.end : d.start
		return d
	}
	function Ra(a, b) {
		b && (a.bad = !0)
		return a
	}
	function Tb(a, b, c) {
		var d
		if (b == a.display.lineDiv) {
			d = a.display.lineDiv.childNodes[c]
			if (!d) return Ra(a.clipPos(r(a.display.viewTo - 1)), !0)
			b = null
			c = 0
		} else
			for (d = b; ; d = d.parentNode) {
				if (!d || d == a.display.lineDiv) return null
				if (d.parentNode && d.parentNode == a.display.lineDiv) break
			}
		for (var e = 0; e < a.display.view.length; e++) {
			var f = a.display.view[e]
			if (f.node == d) return wf(f, b, c)
		}
	}
	function wf(a, b, c) {
		function d(b, c, d) {
			for (var e = -1; e < (l ? l.length : 0); e++)
				for (var f = 0 > e ? k.map : l[e], g = 0; g < f.length; g += 3) {
					var h = f[g + 2]
					if (h == b || h == c) {
						c = F(0 > e ? a.line : a.rest[e])
						e = f[g] + d
						if (0 > d || h != b) e = f[g + (d ? 1 : 0)]
						return r(c, e)
					}
				}
		}
		var e = a.text.firstChild,
			f = !1
		if (!b || !Wc(e, b)) return Ra(r(F(a.line), 0), !0)
		if (b == e && ((f = !0), (b = e.childNodes[c]), (c = 0), !b)) return (c = a.rest ? A(a.rest) : a.line), Ra(r(F(c), c.text.length), f)
		var g = 3 == b.nodeType ? b : null,
			h = b
		g || 1 != b.childNodes.length || 3 != b.firstChild.nodeType || ((g = b.firstChild), c && (c = g.nodeValue.length))
		for (; h.parentNode != e; ) h = h.parentNode
		var k = a.measure,
			l = k.maps
		if ((b = d(g, h, c))) return Ra(b, f)
		e = h.nextSibling
		for (g = g ? g.nodeValue.length - c : 0; e; e = e.nextSibling) {
			if ((b = d(e, e.firstChild, 0))) return Ra(r(b.line, b.ch - g), f)
			g += e.textContent.length
		}
		h = h.previousSibling
		for (g = c; h; h = h.previousSibling) {
			if ((b = d(h, h.firstChild, -1))) return Ra(r(b.line, b.ch + g), f)
			g += e.textContent.length
		}
	}
	function xf(a, b, c, d, e) {
		function f(a) {
			return function (b) {
				return b.id == a
			}
		}
		function g(b) {
			if (1 == b.nodeType) {
				var c = b.getAttribute("cm-text")
				if (null != c) "" == c && (c = b.textContent.replace(/\u200b/g, "")), (h += c)
				else {
					var c = b.getAttribute("cm-marker"),
						p
					if (c) (b = a.findMarks(r(d, 0), r(e + 1, 0), f(+c))), b.length && (p = b[0].find()) && (h += Da(a.doc, p.from, p.to).join("\n"))
					else if ("false" != b.getAttribute("contenteditable")) {
						for (p = 0; p < b.childNodes.length; p++) g(b.childNodes[p])
						;/^(pre|div|p)$/i.test(b.nodeName) && (k = !0)
					}
				}
			} else 3 == b.nodeType && (b = b.nodeValue) && (k && ((h += "\n"), (k = !1)), (h += b))
		}
		for (var h = "", k = !1; ; ) {
			g(b)
			if (b == c) break
			b = b.nextSibling
		}
		return h
	}
	function la(a, b) {
		this.ranges = a
		this.primIndex = b
	}
	function z(a, b) {
		this.anchor = a
		this.head = b
	}
	function Z(a, b) {
		var c = a[b]
		a.sort(function (a, b) {
			return y(a.from(), b.from())
		})
		b = D(a, c)
		for (c = 1; c < a.length; c++) {
			var d = a[c],
				e = a[c - 1]
			if (0 <= y(e.to(), d.from())) {
				var f = Qb(e.from(), d.from()),
					g = Pb(e.to(), d.to()),
					d = e.empty() ? d.from() == d.head : e.from() == e.head
				c <= b && --b
				a.splice(--c, 2, new z(d ? g : f, d ? f : g))
			}
		}
		return new la(a, b)
	}
	function ga(a, b) {
		return new la([new z(a, b || a)], 0)
	}
	function w(a, b) {
		if (b.line < a.first) return r(a.first, 0)
		var c = a.first + a.size - 1
		if (b.line > c) return r(c, u(a, c).text.length)
		var c = u(a, b.line).text.length,
			d = b.ch,
			c = null == d || d > c ? r(b.line, c) : 0 > d ? r(b.line, 0) : b
		return c
	}
	function qb(a, b) {
		return b >= a.first && b < a.first + a.size
	}
	function rb(a, b, c, d) {
		return (a.cm && a.cm.display.shift) || a.extend ? ((a = b.anchor), d && ((b = 0 > y(c, a)), b != 0 > y(d, a) ? ((a = c), (c = d)) : b != 0 > y(c, d) && (c = d)), new z(a, c)) : new z(d || c, c)
	}
	function Ub(a, b, c, d) {
		H(a, new la([rb(a, a.sel.primary(), b, c)], 0), d)
	}
	function ae(a, b, c) {
		for (var d = [], e = 0; e < a.sel.ranges.length; e++) d[e] = rb(a, a.sel.ranges[e], b[e], null)
		b = Z(d, a.sel.primIndex)
		H(a, b, c)
	}
	function Xc(a, b, c, d) {
		var e = a.sel.ranges.slice(0)
		e[b] = c
		H(a, Z(e, a.sel.primIndex), d)
	}
	function yf(a, b) {
		var c = {
			ranges: b.ranges,
			update: function (b) {
				this.ranges = []
				for (var c = 0; c < b.length; c++) this.ranges[c] = new z(w(a, b[c].anchor), w(a, b[c].head))
			}
		}
		K(a, "beforeSelectionChange", a, c)
		a.cm && K(a.cm, "beforeSelectionChange", a.cm, c)
		return c.ranges != b.ranges ? Z(c.ranges, c.ranges.length - 1) : b
	}
	function be(a, b, c) {
		var d = a.history.done,
			e = A(d)
		e && e.ranges ? ((d[d.length - 1] = b), Vb(a, b, c)) : H(a, b, c)
	}
	function H(a, b, c) {
		Vb(a, b, c)
		b = a.sel
		var d = a.cm ? a.cm.curOp.id : NaN,
			e = a.history,
			f = c && c.origin,
			g
		if (!(g = d == e.lastSelOp) && (g = f && e.lastSelOrigin == f) && !(g = e.lastModTime == e.lastSelTime && e.lastOrigin == f)) {
			g = A(e.done)
			var h = f.charAt(0)
			g = "*" == h || ("+" == h && g.ranges.length == b.ranges.length && g.somethingSelected() == b.somethingSelected() && new Date() - a.history.lastSelTime <= (a.cm ? a.cm.options.historyEventDelay : 500))
		}
		g ? (e.done[e.done.length - 1] = b) : Wb(b, e.done)
		e.lastSelTime = +new Date()
		e.lastSelOrigin = f
		e.lastSelOp = d
		c && !1 !== c.clearRedo && ce(e.undone)
	}
	function Vb(a, b, c) {
		if (S(a, "beforeSelectionChange") || (a.cm && S(a.cm, "beforeSelectionChange"))) b = yf(a, b)
		var d = (c && c.bias) || (0 > y(b.primary().head, a.sel.primary().head) ? -1 : 1)
		de(a, ee(a, b, d, !0))
		;(c && !1 === c.scroll) || !a.cm || Pa(a.cm)
	}
	function de(a, b) {
		b.equals(a.sel) || ((a.sel = b), a.cm && ((a.cm.curOp.updateInput = a.cm.curOp.selectionChanged = !0), fe(a.cm)), L(a, "cursorActivity", a))
	}
	function ge(a) {
		de(a, ee(a, a.sel, null, !1), ha)
	}
	function ee(a, b, c, d) {
		for (var e, f = 0; f < b.ranges.length; f++) {
			var g = b.ranges[f],
				h = Xb(a, g.anchor, c, d),
				k = Xb(a, g.head, c, d)
			if (e || h != g.anchor || k != g.head) e || (e = b.ranges.slice(0, f)), (e[f] = new z(h, k))
		}
		return e ? Z(e, b.primIndex) : b
	}
	function Xb(a, b, c, d) {
		var e = !1,
			f = b,
			g = c || 1
		a.cantEdit = !1
		a: for (;;) {
			var h = u(a, f.line)
			if (h.markedSpans)
				for (var k = 0; k < h.markedSpans.length; ++k) {
					var l = h.markedSpans[k],
						m = l.marker
					if ((null == l.from || (m.inclusiveLeft ? l.from <= f.ch : l.from < f.ch)) && (null == l.to || (m.inclusiveRight ? l.to >= f.ch : l.to > f.ch))) {
						if (d && (K(m, "beforeCursorEnter"), m.explicitlyCleared))
							if (h.markedSpans) {
								--k
								continue
							} else break
						if (m.atomic) {
							k = m.find(0 > g ? -1 : 1)
							if (0 == y(k, f) && ((k.ch += g), 0 > k.ch ? (k = k.line > a.first ? w(a, r(k.line - 1)) : null) : k.ch > h.text.length && (k = k.line < a.first + a.size - 1 ? r(k.line + 1, 0) : null), !k)) {
								if (e) {
									if (!d) return Xb(a, b, c, !0)
									a.cantEdit = !0
									return r(a.first, 0)
								}
								e = !0
								k = b
								g = -g
							}
							f = k
							continue a
						}
					}
				}
			return f
		}
	}
	function nb(a) {
		a.display.input.showSelection(a.display.input.prepareSelection())
	}
	function he(a, b) {
		for (var c = a.doc, d = {}, e = (d.cursors = document.createDocumentFragment()), f = (d.selection = document.createDocumentFragment()), g = 0; g < c.sel.ranges.length; g++)
			if (!1 !== b || g != c.sel.primIndex) {
				var h = c.sel.ranges[g],
					k = h.empty()
				if (k || a.options.showCursorWhenSelecting) {
					var l = a,
						m = e,
						p = ma(l, h.head, "div", null, null, !l.options.singleCursorHeightPerLine),
						n = m.appendChild(t("div", " ", "CodeMirror-cursor"))
					n.style.left = p.left + "px"
					n.style.top = p.top + "px"
					n.style.height = Math.max(0, p.bottom - p.top) * l.options.cursorHeight + "px"
					p.other && ((l = m.appendChild(t("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor"))), (l.style.display = ""), (l.style.left = p.other.left + "px"), (l.style.top = p.other.top + "px"), (l.style.height = 0.85 * (p.other.bottom - p.other.top) + "px"))
				}
				k || zf(a, h, f)
			}
		return d
	}
	function zf(a, b, c) {
		function d(a, b, c, d) {
			0 > b && (b = 0)
			b = Math.round(b)
			d = Math.round(d)
			h.appendChild(t("div", null, "CodeMirror-selected", "position: absolute; left: " + a + "px; top: " + b + "px; width: " + (null == c ? m - a : c) + "px; height: " + (d - b) + "px"))
		}
		function e(b, c, e) {
			var f = u(g, b),
				h = f.text.length,
				k,
				p
			Af(Y(f), c || 0, null == e ? h : e, function (g, q, t) {
				var u = Yb(a, r(b, g), "div", f, "left"),
					v,
					w
				g == q ? ((v = u), (t = w = u.left)) : ((v = Yb(a, r(b, q - 1), "div", f, "right")), "rtl" == t && ((t = u), (u = v), (v = t)), (t = u.left), (w = v.right))
				null == c && 0 == g && (t = l)
				3 < v.top - u.top && (d(t, u.top, null, u.bottom), (t = l), u.bottom < v.top && d(t, u.bottom, null, v.top))
				null == e && q == h && (w = m)
				if (!k || u.top < k.top || (u.top == k.top && u.left < k.left)) k = u
				if (!p || v.bottom > p.bottom || (v.bottom == p.bottom && v.right > p.right)) p = v
				t < l + 1 && (t = l)
				d(t, v.top, w - t, v.bottom)
			})
			return { start: k, end: p }
		}
		var f = a.display,
			g = a.doc,
			h = document.createDocumentFragment(),
			k = ie(a.display),
			l = k.left,
			m = Math.max(f.sizerWidth, pa(a) - f.sizer.offsetLeft) - k.right,
			f = b.from()
		b = b.to()
		if (f.line == b.line) e(f.line, f.ch, b.ch)
		else {
			var p = u(g, f.line),
				k = u(g, b.line),
				k = ia(p) == ia(k),
				f = e(f.line, f.ch, k ? p.text.length + 1 : null).end
			b = e(b.line, k ? 0 : null, b.ch).start
			k && (f.top < b.top - 2 ? (d(f.right, f.top, null, f.bottom), d(l, b.top, b.left, b.bottom)) : d(f.right, f.top, b.left - f.right, f.bottom))
			f.bottom < b.top && d(l, f.bottom, null, b.top)
		}
		c.appendChild(h)
	}
	function Yc(a) {
		if (a.state.focused) {
			var b = a.display
			clearInterval(b.blinker)
			var c = !0
			b.cursorDiv.style.visibility = ""
			0 < a.options.cursorBlinkRate
				? (b.blinker = setInterval(function () {
						b.cursorDiv.style.visibility = (c = !c) ? "" : "hidden"
				  }, a.options.cursorBlinkRate))
				: 0 > a.options.cursorBlinkRate && (b.cursorDiv.style.visibility = "hidden")
		}
	}
	function fb(a, b) {
		a.doc.mode.startState && a.doc.frontier < a.display.viewTo && a.state.highlight.set(b, cb(Bf, a))
	}
	function Bf(a) {
		var b = a.doc
		b.frontier < b.first && (b.frontier = b.first)
		if (!(b.frontier >= a.display.viewTo)) {
			var c = +new Date() + a.options.workTime,
				d = Sa(b.mode, sb(a, b.frontier)),
				e = []
			b.iter(b.frontier, Math.min(b.first + b.size, a.display.viewTo + 500), function (f) {
				if (b.frontier >= a.display.viewFrom) {
					var g = f.styles,
						h = je(a, f, d, !0)
					f.styles = h.styles
					var k = f.styleClasses
					;(h = h.classes) ? (f.styleClasses = h) : k && (f.styleClasses = null)
					k = !g || g.length != f.styles.length || (k != h && (!k || !h || k.bgClass != h.bgClass || k.textClass != h.textClass))
					for (h = 0; !k && h < g.length; ++h) k = g[h] != f.styles[h]
					k && e.push(b.frontier)
					f.stateAfter = Sa(b.mode, d)
				} else Zc(a, f.text, d), (f.stateAfter = 0 == b.frontier % 5 ? Sa(b.mode, d) : null)
				++b.frontier
				if (+new Date() > c) return fb(a, a.options.workDelay), !0
			})
			e.length &&
				T(a, function () {
					for (var b = 0; b < e.length; b++) na(a, e[b], "text")
				})
		}
	}
	function Cf(a, b, c) {
		for (var d, e, f = a.doc, g = c ? -1 : b - (a.doc.mode.innerMode ? 1e3 : 100); b > g; --b) {
			if (b <= f.first) return f.first
			var h = u(f, b - 1)
			if (h.stateAfter && (!c || b <= f.frontier)) return b
			h = aa(h.text, null, a.options.tabSize)
			if (null == e || d > h) (e = b - 1), (d = h)
		}
		return e
	}
	function sb(a, b, c) {
		var d = a.doc,
			e = a.display
		if (!d.mode.startState) return !0
		var f = Cf(a, b, c),
			g = f > d.first && u(d, f - 1).stateAfter,
			g = g ? Sa(d.mode, g) : Df(d.mode)
		d.iter(f, b, function (c) {
			Zc(a, c.text, g)
			c.stateAfter = f == b - 1 || 0 == f % 5 || (f >= e.viewFrom && f < e.viewTo) ? Sa(d.mode, g) : null
			++f
		})
		c && (d.frontier = f)
		return g
	}
	function Ec(a) {
		return a.mover.offsetHeight - a.lineSpace.offsetHeight
	}
	function ie(a) {
		if (a.cachedPaddingH) return a.cachedPaddingH
		var b = U(a.measure, t("pre", "x")),
			b = window.getComputedStyle ? window.getComputedStyle(b) : b.currentStyle,
			b = { left: parseInt(b.paddingLeft), right: parseInt(b.paddingRight) }
		isNaN(b.left) || isNaN(b.right) || (a.cachedPaddingH = b)
		return b
	}
	function da(a) {
		return Hd - a.display.nativeBarWidth
	}
	function pa(a) {
		return a.display.scroller.clientWidth - da(a) - a.display.barWidth
	}
	function Nc(a) {
		return a.display.scroller.clientHeight - da(a) - a.display.barHeight
	}
	function Zd(a, b, c) {
		if (a.line == b) return { map: a.measure.map, cache: a.measure.cache }
		for (var d = 0; d < a.rest.length; d++) if (a.rest[d] == b) return { map: a.measure.maps[d], cache: a.measure.caches[d] }
		for (d = 0; d < a.rest.length; d++) if (F(a.rest[d]) > c) return { map: a.measure.maps[d], cache: a.measure.caches[d], before: !0 }
	}
	function Vc(a, b) {
		if (b >= a.display.viewFrom && b < a.display.viewTo) return a.display.view[Ca(a, b)]
		var c = a.display.externalMeasured
		if (c && b >= c.lineN && b < c.lineN + c.size) return c
	}
	function Zb(a, b) {
		var c = F(b),
			d = Vc(a, c)
		d && !d.text ? (d = null) : d && d.changes && Od(a, d, c, Kc(a))
		if (!d) {
			var e
			e = ia(b)
			d = F(e)
			e = a.display.externalMeasured = new ke(a.doc, e, d)
			e.lineN = d
			d = e.built = Sd(a, e)
			e.text = d.pre
			U(a.display.lineMeasure, d.pre)
			d = e
		}
		c = Zd(d, b, c)
		return { line: b, view: d, rect: null, map: c.map, cache: c.cache, before: c.before, hasHeights: !1 }
	}
	function $c(a, b, c, d, e) {
		b.before && (c = -1)
		var f = c + (d || "")
		if (b.cache.hasOwnProperty(f)) a = b.cache[f]
		else {
			b.rect || (b.rect = b.view.text.getBoundingClientRect())
			if (!b.hasHeights) {
				var g = b.view,
					h = b.rect,
					k = a.options.lineWrapping,
					l = k && pa(a)
				if (!g.measure.heights || (k && g.measure.width != l)) {
					var m = (g.measure.heights = [])
					if (k)
						for (g.measure.width = l, g = g.text.firstChild.getClientRects(), k = 0; k < g.length - 1; k++) {
							var l = g[k],
								p = g[k + 1]
							2 < Math.abs(l.bottom - p.bottom) && m.push((l.bottom + p.top) / 2 - h.top)
						}
					m.push(h.bottom - h.top)
				}
				b.hasHeights = !0
			}
			g = d
			k = $d(b.map, c, g)
			d = k.node
			h = k.start
			l = k.end
			c = k.collapse
			var n
			if (3 == d.nodeType) {
				for (m = 0; 4 > m; m++) {
					for (; h && tb(b.line.text.charAt(k.coverStart + h)); ) --h
					for (; k.coverStart + l < k.coverEnd && tb(b.line.text.charAt(k.coverStart + l)); ) ++l
					if (B && 9 > C && 0 == h && l == k.coverEnd - k.coverStart) n = d.parentNode.getBoundingClientRect()
					else if (B && a.options.lineWrapping) {
						var E = Ea(d, h, l).getClientRects()
						n = E.length ? E["right" == g ? E.length - 1 : 0] : ad
					} else n = Ea(d, h, l).getBoundingClientRect() || ad
					if (n.left || n.right || 0 == h) break
					l = h
					--h
					c = "right"
				}
				B &&
					11 > C &&
					((E = !window.screen || null == screen.logicalXDPI || screen.logicalXDPI == screen.deviceXDPI) || (null != bd ? (E = bd) : ((m = U(a.display.measure, t("span", "x"))), (E = m.getBoundingClientRect()), (m = Ea(m, 0, 1).getBoundingClientRect()), (E = bd = 1 < Math.abs(E.left - m.left))), (E = !E)),
					E || ((E = screen.logicalXDPI / screen.deviceXDPI), (m = screen.logicalYDPI / screen.deviceYDPI), (n = { left: n.left * E, right: n.right * E, top: n.top * m, bottom: n.bottom * m })))
			} else 0 < h && (c = g = "right"), (n = a.options.lineWrapping && 1 < (E = d.getClientRects()).length ? E["right" == g ? E.length - 1 : 0] : d.getBoundingClientRect())
			!(B && 9 > C) || h || (n && (n.left || n.right)) || (n = (n = d.parentNode.getClientRects()[0]) ? { left: n.left, right: n.left + gb(a.display), top: n.top, bottom: n.bottom } : ad)
			E = n.top - b.rect.top
			d = n.bottom - b.rect.top
			h = (E + d) / 2
			g = b.view.measure.heights
			for (m = 0; m < g.length - 1 && !(h < g[m]); m++);
			c = { left: ("right" == c ? n.right : n.left) - b.rect.left, right: ("left" == c ? n.left : n.right) - b.rect.left, top: m ? g[m - 1] : 0, bottom: g[m] }
			n.left || n.right || (c.bogus = !0)
			a.options.singleCursorHeightPerLine || ((c.rtop = E), (c.rbottom = d))
			a = c
			a.bogus || (b.cache[f] = a)
		}
		return { left: a.left, right: a.right, top: e ? a.rtop : a.top, bottom: e ? a.rbottom : a.bottom }
	}
	function $d(a, b, c) {
		for (var d, e, f, g, h = 0; h < a.length; h += 3) {
			var k = a[h],
				l = a[h + 1]
			if (b < k) (e = 0), (f = 1), (g = "left")
			else if (b < l) (e = b - k), (f = e + 1)
			else if (h == a.length - 3 || (b == l && a[h + 3] > b)) (f = l - k), (e = f - 1), b >= l && (g = "right")
			if (null != e) {
				d = a[h + 2]
				k == l && c == (d.insertLeft ? "left" : "right") && (g = c)
				if ("left" == c && 0 == e) for (; h && a[h - 2] == a[h - 3] && a[h - 1].insertLeft; ) (d = a[(h -= 3) + 2]), (g = "left")
				if ("right" == c && e == l - k) for (; h < a.length - 3 && a[h + 3] == a[h + 4] && !a[h + 5].insertLeft; ) (d = a[(h += 3) + 2]), (g = "right")
				break
			}
		}
		return { node: d, start: e, end: f, collapse: g, coverStart: k, coverEnd: l }
	}
	function le(a) {
		if (a.measure && ((a.measure.cache = {}), (a.measure.heights = null), a.rest)) for (var b = 0; b < a.rest.length; b++) a.measure.caches[b] = {}
	}
	function me(a) {
		a.display.externalMeasure = null
		za(a.display.lineMeasure)
		for (var b = 0; b < a.display.view.length; b++) le(a.display.view[b])
	}
	function hb(a) {
		me(a)
		a.display.cachedCharWidth = a.display.cachedTextHeight = a.display.cachedPaddingH = null
		a.options.lineWrapping || (a.display.maxLineChanged = !0)
		a.display.lineNumChars = null
	}
	function cd(a, b, c, d) {
		if (b.widgets)
			for (var e = 0; e < b.widgets.length; ++e)
				if (b.widgets[e].above) {
					var f = ub(b.widgets[e])
					c.top += f
					c.bottom += f
				}
		if ("line" == d) return c
		d || (d = "local")
		b = ea(b)
		b = "local" == d ? b + a.display.lineSpace.offsetTop : b - a.display.viewOffset
		if ("page" == d || "window" == d) (a = a.display.lineSpace.getBoundingClientRect()), (b += a.top + ("window" == d ? 0 : window.pageYOffset || (document.documentElement || document.body).scrollTop)), (d = a.left + ("window" == d ? 0 : window.pageXOffset || (document.documentElement || document.body).scrollLeft)), (c.left += d), (c.right += d)
		c.top += b
		c.bottom += b
		return c
	}
	function ne(a, b, c) {
		if ("div" == c) return b
		var d = b.left
		b = b.top
		"page" == c ? ((d -= window.pageXOffset || (document.documentElement || document.body).scrollLeft), (b -= window.pageYOffset || (document.documentElement || document.body).scrollTop)) : ("local" != c && c) || ((c = a.display.sizer.getBoundingClientRect()), (d += c.left), (b += c.top))
		a = a.display.lineSpace.getBoundingClientRect()
		return { left: d - a.left, top: b - a.top }
	}
	function Yb(a, b, c, d, e) {
		d || (d = u(a.doc, b.line))
		var f = d
		b = b.ch
		d = $c(a, Zb(a, d), b, e)
		return cd(a, f, d, c)
	}
	function ma(a, b, c, d, e, f) {
		function g(b, g) {
			var h = $c(a, e, b, g ? "right" : "left", f)
			g ? (h.left = h.right) : (h.right = h.left)
			return cd(a, d, h, c)
		}
		function h(a, b) {
			var c = k[b],
				d = c.level % 2
			a == dd(c) && b && c.level < k[b - 1].level ? ((c = k[--b]), (a = ed(c) - (c.level % 2 ? 0 : 1)), (d = !0)) : a == ed(c) && b < k.length - 1 && c.level < k[b + 1].level && ((c = k[++b]), (a = dd(c) - (c.level % 2)), (d = !1))
			return d && a == c.to && a > c.from ? g(a - 1) : g(a, d)
		}
		d = d || u(a.doc, b.line)
		e || (e = Zb(a, d))
		var k = Y(d)
		b = b.ch
		if (!k) return g(b)
		var l = Sb(k, b),
			l = h(b, l)
		null != vb && (l.other = h(b, vb))
		return l
	}
	function oe(a, b) {
		var c = 0
		b = w(a.doc, b)
		a.options.lineWrapping || (c = gb(a.display) * b.ch)
		var d = u(a.doc, b.line),
			e = ea(d) + a.display.lineSpace.offsetTop
		return { left: c, right: c, top: e, bottom: e + d.height }
	}
	function $b(a, b, c, d) {
		a = r(a, b)
		a.xRel = d
		c && (a.outside = !0)
		return a
	}
	function fd(a, b, c) {
		var d = a.doc
		c += a.display.viewOffset
		if (0 > c) return $b(d.first, 0, !0, -1)
		var e = Ba(d, c),
			f = d.first + d.size - 1
		if (e > f) return $b(d.first + d.size - 1, u(d, f).text.length, !0, 1)
		0 > b && (b = 0)
		for (d = u(d, e); ; )
			if (((e = Ef(a, d, e, b, c)), (f = (d = Aa(d, !1)) && d.find(0, !0)), d && (e.ch > f.from.ch || (e.ch == f.from.ch && 0 < e.xRel)))) e = F((d = f.to.line))
			else return e
	}
	function Ef(a, b, c, d, e) {
		function f(d) {
			d = ma(a, r(c, d), "line", b, l)
			h = !0
			if (g > d.bottom) return d.left - k
			if (g < d.top) return d.left + k
			h = !1
			return d.left
		}
		var g = e - ea(b),
			h = !1,
			k = 2 * a.display.wrapper.clientWidth,
			l = Zb(a, b),
			m = Y(b),
			p = b.text.length
		e = ac(b)
		var n = bc(b),
			E = f(e),
			q = h,
			t = f(n),
			u = h
		if (d > t) return $b(c, n, u, 1)
		for (;;) {
			if (m ? n == e || n == gd(b, e, 1) : 1 >= n - e) {
				m = d < E || d - E <= t - d ? e : n
				for (d -= m == e ? E : t; tb(b.text.charAt(m)); ) ++m
				return $b(c, m, m == e ? q : u, -1 > d ? -1 : 1 < d ? 1 : 0)
			}
			var v = Math.ceil(p / 2),
				w = e + v
			if (m) for (var w = e, x = 0; x < v; ++x) w = gd(b, w, 1)
			x = f(w)
			if (x > d) {
				n = w
				t = x
				if ((u = h)) t += 1e3
				p = v
			} else (e = w), (E = x), (q = h), (p -= v)
		}
	}
	function xa(a) {
		if (null != a.cachedTextHeight) return a.cachedTextHeight
		if (null == Fa) {
			Fa = t("pre")
			for (var b = 0; 49 > b; ++b) Fa.appendChild(document.createTextNode("x")), Fa.appendChild(t("br"))
			Fa.appendChild(document.createTextNode("x"))
		}
		U(a.measure, Fa)
		b = Fa.offsetHeight / 50
		3 < b && (a.cachedTextHeight = b)
		za(a.measure)
		return b || 1
	}
	function gb(a) {
		if (null != a.cachedCharWidth) return a.cachedCharWidth
		var b = t("span", "xxxxxxxxxx"),
			c = t("pre", [b])
		U(a.measure, c)
		b = b.getBoundingClientRect()
		b = (b.right - b.left) / 10
		2 < b && (a.cachedCharWidth = b)
		return b || 10
	}
	function Ja(a) {
		a.curOp = { cm: a, viewChanged: !1, startHeight: a.doc.height, forceUpdate: !1, updateInput: null, typing: !1, changeObjs: null, cursorActivityHandlers: null, cursorActivityCalled: 0, selectionChanged: !1, updateMaxLine: !1, scrollLeft: null, scrollTop: null, scrollToPos: null, focus: !1, id: ++Ff }
		Ta ? Ta.ops.push(a.curOp) : (a.curOp.ownsGroup = Ta = { ops: [a.curOp], delayedCallbacks: [] })
	}
	function La(a) {
		if ((a = a.curOp.ownsGroup))
			try {
				var b = a.delayedCallbacks,
					c = 0
				do {
					for (; c < b.length; c++) b[c]()
					for (var d = 0; d < a.ops.length; d++) {
						var e = a.ops[d]
						if (e.cursorActivityHandlers) for (; e.cursorActivityCalled < e.cursorActivityHandlers.length; ) e.cursorActivityHandlers[e.cursorActivityCalled++](e.cm)
					}
				} while (c < b.length)
			} finally {
				Ta = null
				for (b = 0; b < a.ops.length; b++) a.ops[b].cm.curOp = null
				a = a.ops
				for (b = 0; b < a.length; b++) {
					var e = a[b],
						c = e.cm,
						f = (d = c.display)
					!f.scrollbarsClipped && f.scroller.offsetWidth && ((f.nativeBarWidth = f.scroller.offsetWidth - f.scroller.clientWidth), (f.heightForcer.style.height = da(c) + "px"), (f.sizer.style.marginBottom = -f.nativeBarWidth + "px"), (f.sizer.style.borderRightWidth = da(c) + "px"), (f.scrollbarsClipped = !0))
					e.updateMaxLine && Dc(c)
					e.mustUpdate = e.viewChanged || e.forceUpdate || null != e.scrollTop || (e.scrollToPos && (e.scrollToPos.from.line < d.viewFrom || e.scrollToPos.to.line >= d.viewTo)) || (d.maxLineChanged && c.options.lineWrapping)
					e.update = e.mustUpdate && new Mb(c, e.mustUpdate && { top: e.scrollTop, ensure: e.scrollToPos }, e.forceUpdate)
				}
				for (b = 0; b < a.length; b++) (e = a[b]), (e.updatedDisplay = e.mustUpdate && Lc(e.cm, e.update))
				for (b = 0; b < a.length; b++)
					if (
						((e = a[b]),
						(c = e.cm),
						(d = c.display),
						e.updatedDisplay && Lb(c),
						(e.barMeasure = jb(c)),
						d.maxLineChanged && !c.options.lineWrapping && ((f = void 0), (f = d.maxLine.text.length), (f = $c(c, Zb(c, d.maxLine), f, void 0)), (e.adjustWidthTo = f.left + 3), (c.display.sizerWidth = e.adjustWidthTo), (e.barMeasure.scrollWidth = Math.max(d.scroller.clientWidth, d.sizer.offsetLeft + e.adjustWidthTo + da(c) + c.display.barWidth)), (e.maxScrollLeft = Math.max(0, d.sizer.offsetLeft + e.adjustWidthTo - pa(c)))),
						e.updatedDisplay || e.selectionChanged)
					)
						e.preparedSelection = d.input.prepareSelection()
				for (b = 0; b < a.length; b++)
					(e = a[b]),
						(c = e.cm),
						null != e.adjustWidthTo && ((c.display.sizer.style.minWidth = e.adjustWidthTo + "px"), e.maxScrollLeft < c.doc.scrollLeft && Ma(c, Math.min(c.display.scroller.scrollLeft, e.maxScrollLeft), !0), (c.display.maxLineChanged = !1)),
						e.preparedSelection && c.display.input.showSelection(e.preparedSelection),
						e.updatedDisplay && Oc(c, e.barMeasure),
						(e.updatedDisplay || e.startHeight != c.doc.height) && Na(c, e.barMeasure),
						e.selectionChanged && Yc(c),
						c.state.focused && e.updateInput && c.display.input.reset(e.typing),
						e.focus && e.focus == fa() && Ud(e.cm)
				for (b = 0; b < a.length; b++) {
					e = a[b]
					c = e.cm
					d = c.display
					f = c.doc
					e.updatedDisplay && Md(c, e.update)
					null == d.wheelStartX || (null == e.scrollTop && null == e.scrollLeft && !e.scrollToPos) || (d.wheelStartX = d.wheelStartY = null)
					null == e.scrollTop || (d.scroller.scrollTop == e.scrollTop && !e.forceScroll) || ((f.scrollTop = Math.max(0, Math.min(d.scroller.scrollHeight - d.scroller.clientHeight, e.scrollTop))), d.scrollbars.setScrollTop(f.scrollTop), (d.scroller.scrollTop = f.scrollTop))
					null == e.scrollLeft || (d.scroller.scrollLeft == e.scrollLeft && !e.forceScroll) || ((f.scrollLeft = Math.max(0, Math.min(d.scroller.scrollWidth - pa(c), e.scrollLeft))), d.scrollbars.setScrollLeft(f.scrollLeft), (d.scroller.scrollLeft = f.scrollLeft), Bc(c))
					if (e.scrollToPos) {
						var g = void 0,
							h = w(f, e.scrollToPos.from),
							g = w(f, e.scrollToPos.to),
							k = e.scrollToPos.margin
						null == k && (k = 0)
						for (var l = 0; 5 > l; l++) {
							var m = !1,
								p = ma(c, h),
								n = g && g != h ? ma(c, g) : p,
								n = cc(c, Math.min(p.left, n.left), Math.min(p.top, n.top) - k, Math.max(p.left, n.left), Math.max(p.bottom, n.bottom) + k),
								q = c.doc.scrollTop,
								r = c.doc.scrollLeft
							null != n.scrollTop && (lb(c, n.scrollTop), 1 < Math.abs(c.doc.scrollTop - q) && (m = !0))
							null != n.scrollLeft && (Ma(c, n.scrollLeft), 1 < Math.abs(c.doc.scrollLeft - r) && (m = !0))
							if (!m) break
						}
						g = p
						e.scrollToPos.isCursor &&
							c.state.focused &&
							(ja(c, "scrollCursorIntoView") ||
								((k = c.display),
								(l = k.sizer.getBoundingClientRect()),
								(h = null),
								0 > g.top + l.top ? (h = !0) : g.bottom + l.top > (window.innerHeight || document.documentElement.clientHeight) && (h = !1),
								null == h || Gf || ((g = t("div", "​", null, "position: absolute; top: " + (g.top - k.viewOffset - c.display.lineSpace.offsetTop) + "px; height: " + (g.bottom - g.top + da(c) + k.barHeight) + "px; left: " + g.left + "px; width: 2px;")), c.display.lineSpace.appendChild(g), g.scrollIntoView(h), c.display.lineSpace.removeChild(g))))
					}
					h = e.maybeHiddenMarkers
					g = e.maybeUnhiddenMarkers
					if (h) for (k = 0; k < h.length; ++k) h[k].lines.length || K(h[k], "hide")
					if (g) for (k = 0; k < g.length; ++k) g[k].lines.length && K(g[k], "unhide")
					d.wrapper.offsetHeight && (f.scrollTop = c.display.scroller.scrollTop)
					e.changeObjs && K(c, "changes", c, e.changeObjs)
					e.update && e.update.finish()
				}
			}
	}
	function T(a, b) {
		if (a.curOp) return b()
		Ja(a)
		try {
			return b()
		} finally {
			La(a)
		}
	}
	function G(a, b) {
		return function () {
			if (a.curOp) return b.apply(a, arguments)
			Ja(a)
			try {
				return b.apply(a, arguments)
			} finally {
				La(a)
			}
		}
	}
	function M(a) {
		return function () {
			if (this.curOp) return a.apply(this, arguments)
			Ja(this)
			try {
				return a.apply(this, arguments)
			} finally {
				La(this)
			}
		}
	}
	function N(a) {
		return function () {
			var b = this.cm
			if (!b || b.curOp) return a.apply(this, arguments)
			Ja(b)
			try {
				return a.apply(this, arguments)
			} finally {
				La(b)
			}
		}
	}
	function ke(a, b, c) {
		for (var d = (this.line = b), e; (d = Aa(d, !1)); ) (d = d.find(1, !0).line), (e || (e = [])).push(d)
		this.size = (this.rest = e) ? F(A(this.rest)) - c + 1 : 1
		this.node = this.text = null
		this.hidden = ya(a, b)
	}
	function Nb(a, b, c) {
		var d = [],
			e
		for (e = b; e < c; ) (b = new ke(a.doc, u(a.doc, e), e)), (e += b.size), d.push(b)
		return d
	}
	function Q(a, b, c, d) {
		null == b && (b = a.doc.first)
		null == c && (c = a.doc.first + a.doc.size)
		d || (d = 0)
		var e = a.display
		d && c < e.viewTo && (null == e.updateLineNumbers || e.updateLineNumbers > b) && (e.updateLineNumbers = b)
		a.curOp.viewChanged = !0
		if (b >= e.viewTo) ra && Mc(a.doc, b) < e.viewTo && qa(a)
		else if (c <= e.viewFrom) ra && Ld(a.doc, c + d) > e.viewFrom ? qa(a) : ((e.viewFrom += d), (e.viewTo += d))
		else if (b <= e.viewFrom && c >= e.viewTo) qa(a)
		else if (b <= e.viewFrom) {
			var f = dc(a, c, c + d, 1)
			f ? ((e.view = e.view.slice(f.index)), (e.viewFrom = f.lineN), (e.viewTo += d)) : qa(a)
		} else if (c >= e.viewTo) (f = dc(a, b, b, -1)) ? ((e.view = e.view.slice(0, f.index)), (e.viewTo = f.lineN)) : qa(a)
		else {
			var f = dc(a, b, b, -1),
				g = dc(a, c, c + d, 1)
			f && g ? ((e.view = e.view.slice(0, f.index).concat(Nb(a, f.lineN, g.lineN)).concat(e.view.slice(g.index))), (e.viewTo += d)) : qa(a)
		}
		if ((a = e.externalMeasured)) c < a.lineN ? (a.lineN += d) : b < a.lineN + a.size && (e.externalMeasured = null)
	}
	function na(a, b, c) {
		a.curOp.viewChanged = !0
		var d = a.display,
			e = a.display.externalMeasured
		e && b >= e.lineN && b < e.lineN + e.size && (d.externalMeasured = null)
		b < d.viewFrom || b >= d.viewTo || ((a = d.view[Ca(a, b)]), null != a.node && ((a = a.changes || (a.changes = [])), -1 == D(a, c) && a.push(c)))
	}
	function qa(a) {
		a.display.viewFrom = a.display.viewTo = a.doc.first
		a.display.view = []
		a.display.viewOffset = 0
	}
	function Ca(a, b) {
		if (b >= a.display.viewTo) return null
		b -= a.display.viewFrom
		if (0 > b) return null
		for (var c = a.display.view, d = 0; d < c.length; d++) if (((b -= c[d].size), 0 > b)) return d
	}
	function dc(a, b, c, d) {
		var e = Ca(a, b),
			f = a.display.view
		if (!ra || c == a.doc.first + a.doc.size) return { index: e, lineN: c }
		for (var g = 0, h = a.display.viewFrom; g < e; g++) h += f[g].size
		if (h != b) {
			if (0 < d) {
				if (e == f.length - 1) return null
				b = h + f[e].size - b
				e++
			} else b = h - b
			c += b
		}
		for (; Mc(a.doc, c) != c; ) {
			if (e == (0 > d ? 0 : f.length - 1)) return null
			c += d * f[e - (0 > d ? 1 : 0)].size
			e += d
		}
		return { index: e, lineN: c }
	}
	function Kd(a) {
		a = a.display.view
		for (var b = 0, c = 0; c < a.length; c++) {
			var d = a[c]
			d.hidden || (d.node && !d.changes) || ++b
		}
		return b
	}
	function sf(a) {
		function b() {
			d.activeTouch &&
				((e = setTimeout(function () {
					d.activeTouch = null
				}, 1e3)),
				(f = d.activeTouch),
				(f.end = +new Date()))
		}
		function c(a, b) {
			if (null == b.left) return !0
			var c = b.left - a.left,
				d = b.top - a.top
			return 400 < c * c + d * d
		}
		var d = a.display
		v(d.scroller, "mousedown", G(a, pe))
		B && 11 > C
			? v(
					d.scroller,
					"dblclick",
					G(a, function (b) {
						if (!ja(a, b)) {
							var c = Ua(a, b)
							!c || hd(a, b, "gutterClick", !0, L) || oa(a.display, b) || (O(b), (b = a.findWordAt(c)), Ub(a.doc, b.anchor, b.head))
						}
					})
			  )
			: v(d.scroller, "dblclick", function (b) {
					ja(a, b) || O(b)
			  })
		id ||
			v(d.scroller, "contextmenu", function (b) {
				qe(a, b)
			})
		var e,
			f = { end: 0 }
		v(d.scroller, "touchstart", function (a) {
			var b
			1 != a.touches.length ? (b = !1) : ((b = a.touches[0]), (b = 1 >= b.radiusX && 1 >= b.radiusY))
			b || (clearTimeout(e), (b = +new Date()), (d.activeTouch = { start: b, moved: !1, prev: 300 >= b - f.end ? f : null }), 1 == a.touches.length && ((d.activeTouch.left = a.touches[0].pageX), (d.activeTouch.top = a.touches[0].pageY)))
		})
		v(d.scroller, "touchmove", function () {
			d.activeTouch && (d.activeTouch.moved = !0)
		})
		v(d.scroller, "touchend", function (e) {
			var f = d.activeTouch
			if (f && !oa(d, e) && null != f.left && !f.moved && 300 > new Date() - f.start) {
				var g = a.coordsChar(d.activeTouch, "page"),
					f = !f.prev || c(f, f.prev) ? new z(g, g) : !f.prev.prev || c(f, f.prev.prev) ? a.findWordAt(g) : new z(r(g.line, 0), w(a.doc, r(g.line + 1, 0)))
				a.setSelection(f.anchor, f.head)
				a.focus()
				O(e)
			}
			b()
		})
		v(d.scroller, "touchcancel", b)
		v(d.scroller, "scroll", function () {
			d.scroller.clientHeight && (lb(a, d.scroller.scrollTop), Ma(a, d.scroller.scrollLeft, !0), K(a, "scroll", a))
		})
		v(d.scroller, "mousewheel", function (b) {
			re(a, b)
		})
		v(d.scroller, "DOMMouseScroll", function (b) {
			re(a, b)
		})
		v(d.wrapper, "scroll", function () {
			d.wrapper.scrollTop = d.wrapper.scrollLeft = 0
		})
		d.dragFunctions = {
			simple: function (b) {
				ja(a, b) || jd(b)
			},
			start: function (b) {
				if (B && (!a.state.draggingText || 100 > +new Date() - se)) jd(b)
				else if (!ja(a, b) && !oa(a.display, b) && (b.dataTransfer.setData("Text", a.getSelection()), b.dataTransfer.setDragImage && !te)) {
					var c = t("img", null, null, "position: fixed; left: 0; top: 0;")
					c.src = "\x3d\x3d"
					ba && ((c.width = c.height = 1), a.display.wrapper.appendChild(c), (c._top = c.offsetTop))
					b.dataTransfer.setDragImage(c, 0, 0)
					ba && c.parentNode.removeChild(c)
				}
			},
			drop: G(a, Hf)
		}
		var g = d.input.getField()
		v(g, "keyup", function (b) {
			ue.call(a, b)
		})
		v(g, "keydown", G(a, ve))
		v(g, "keypress", G(a, we))
		v(g, "focus", cb(xc, a))
		v(g, "blur", cb(db, a))
	}
	function If(a) {
		var b = a.display
		if (b.lastWrapHeight != b.wrapper.clientHeight || b.lastWrapWidth != b.wrapper.clientWidth) (b.cachedCharWidth = b.cachedTextHeight = b.cachedPaddingH = null), (b.scrollbarsClipped = !1), a.setSize()
	}
	function oa(a, b) {
		for (var c = b.target || b.srcElement; c != a.wrapper; c = c.parentNode) if (!c || (1 == c.nodeType && "true" == c.getAttribute("cm-ignore-events")) || (c.parentNode == a.sizer && c != a.mover)) return !0
	}
	function Ua(a, b, c, d) {
		var e = a.display
		if (!c && "true" == (b.target || b.srcElement).getAttribute("cm-not-content")) return null
		var f, g
		c = e.lineSpace.getBoundingClientRect()
		try {
			;(f = b.clientX - c.left), (g = b.clientY - c.top)
		} catch (h) {
			return null
		}
		b = fd(a, f, g)
		var k
		d && 1 == b.xRel && (k = u(a.doc, b.line).text).length == b.ch && ((d = aa(k, k.length, a.options.tabSize) - k.length), (b = r(b.line, Math.max(0, Math.round((f - ie(a.display).left) / gb(a.display)) - d))))
		return b
	}
	function pe(a) {
		var b = this.display
		if (!((b.activeTouch && b.input.supportsTouch()) || ja(this, a)))
			if (((b.shift = a.shiftKey), oa(b, a)))
				J ||
					((b.scroller.draggable = !1),
					setTimeout(function () {
						b.scroller.draggable = !0
					}, 100))
			else if (!hd(this, a, "gutterClick", !0, L)) {
				var c = Ua(this, a)
				window.focus()
				switch (xe(a)) {
					case 1:
						c ? Jf(this, a, c) : (a.target || a.srcElement) == b.scroller && O(a)
						break
					case 2:
						J && (this.state.lastMiddleDown = +new Date())
						c && Ub(this.doc, c)
						setTimeout(function () {
							b.input.focus()
						}, 20)
						O(a)
						break
					case 3:
						id ? qe(this, a) : Kf(this)
				}
			}
	}
	function Jf(a, b, c) {
		B ? setTimeout(cb(Ud, a), 0) : (a.curOp.focus = fa())
		var d = +new Date(),
			e
		ec && ec.time > d - 400 && 0 == y(ec.pos, c) ? (e = "triple") : fc && fc.time > d - 400 && 0 == y(fc.pos, c) ? ((e = "double"), (ec = { time: d, pos: c })) : ((e = "single"), (fc = { time: d, pos: c }))
		var d = a.doc.sel,
			f = W ? b.metaKey : b.ctrlKey,
			g
		a.options.dragDrop && Lf && !Rb(a) && "single" == e && -1 < (g = d.contains(c)) && !d.ranges[g].empty() ? Mf(a, b, c, f) : Nf(a, b, c, e, f)
	}
	function Mf(a, b, c, d) {
		var e = a.display,
			f = +new Date(),
			g = G(a, function (h) {
				J && (e.scroller.draggable = !1)
				a.state.draggingText = !1
				ka(document, "mouseup", g)
				ka(e.scroller, "drop", g)
				10 > Math.abs(b.clientX - h.clientX) + Math.abs(b.clientY - h.clientY) &&
					(O(h),
					!d && +new Date() - 200 < f && Ub(a.doc, c),
					J || (B && 9 == C)
						? setTimeout(function () {
								document.body.focus()
								e.input.focus()
						  }, 20)
						: e.input.focus())
			})
		J && (e.scroller.draggable = !0)
		a.state.draggingText = g
		e.scroller.dragDrop && e.scroller.dragDrop()
		v(document, "mouseup", g)
		v(e.scroller, "drop", g)
	}
	function Nf(a, b, c, d, e) {
		function f(b) {
			if (0 != y(x, b))
				if (((x = b), "rect" == d)) {
					for (var e = [], f = a.options.tabSize, g = aa(u(l, c.line).text, c.ch, f), h = aa(u(l, b.line).text, b.ch, f), k = Math.min(g, h), g = Math.max(g, h), h = Math.min(c.line, b.line), q = Math.min(a.lastLine(), Math.max(c.line, b.line)); h <= q; h++) {
						var E = u(l, h).text,
							t = ye(E, k, f)
						k == g ? e.push(new z(r(h, t), r(h, t))) : E.length > t && e.push(new z(r(h, t), r(h, ye(E, g, f))))
					}
					e.length || e.push(new z(c, c))
					H(l, Z(n.ranges.slice(0, p).concat(e), p), { origin: "*mouse", scroll: !1 })
					a.scrollIntoView(b)
				} else (e = m), (f = e.anchor), (k = b), "single" != d && ((b = "double" == d ? a.findWordAt(b) : new z(r(b.line, 0), w(l, r(b.line + 1, 0)))), 0 < y(b.anchor, f) ? ((k = b.head), (f = Qb(e.from(), b.anchor))) : ((k = b.anchor), (f = Pb(e.to(), b.head)))), (e = n.ranges.slice(0)), (e[p] = new z(w(l, f), k)), H(l, Z(e, p), kd)
		}
		function g(b) {
			var c = ++A,
				e = Ua(a, b, !0, "rect" == d)
			if (e)
				if (0 != y(e, x)) {
					a.curOp.focus = fa()
					f(e)
					var h = Hc(k, l)
					;(e.line >= h.to || e.line < h.from) &&
						setTimeout(
							G(a, function () {
								A == c && g(b)
							}),
							150
						)
				} else {
					var m = b.clientY < B.top ? -20 : b.clientY > B.bottom ? 20 : 0
					m &&
						setTimeout(
							G(a, function () {
								A == c && ((k.scroller.scrollTop += m), g(b))
							}),
							50
						)
				}
		}
		function h(a) {
			A = Infinity
			O(a)
			k.input.focus()
			ka(document, "mousemove", F)
			ka(document, "mouseup", C)
			l.history.lastSelOrigin = null
		}
		var k = a.display,
			l = a.doc
		O(b)
		var m,
			p,
			n = l.sel,
			q = n.ranges
		e && !b.shiftKey ? ((p = l.sel.contains(c)), (m = -1 < p ? q[p] : new z(c, c))) : ((m = l.sel.primary()), (p = l.sel.primIndex))
		if (b.altKey) (d = "rect"), e || (m = new z(c, c)), (c = Ua(a, b, !0, !0)), (p = -1)
		else if ("double" == d) {
			var t = a.findWordAt(c)
			m = a.display.shift || l.extend ? rb(l, m, t.anchor, t.head) : t
		} else "triple" == d ? ((t = new z(r(c.line, 0), w(l, r(c.line + 1, 0)))), (m = a.display.shift || l.extend ? rb(l, m, t.anchor, t.head) : t)) : (m = rb(l, m, c))
		e ? (-1 == p ? ((p = q.length), H(l, Z(q.concat([m]), p), { scroll: !1, origin: "*mouse" })) : 1 < q.length && q[p].empty() && "single" == d && !b.shiftKey ? (H(l, Z(q.slice(0, p).concat(q.slice(p + 1)), 0)), (n = l.sel)) : Xc(l, p, m, kd)) : ((p = 0), H(l, new la([m], 0), kd), (n = l.sel))
		var x = c,
			B = k.wrapper.getBoundingClientRect(),
			A = 0,
			F = G(a, function (a) {
				xe(a) ? g(a) : h(a)
			}),
			C = G(a, h)
		v(document, "mousemove", F)
		v(document, "mouseup", C)
	}
	function hd(a, b, c, d, e) {
		try {
			var f = b.clientX,
				g = b.clientY
		} catch (h) {
			return !1
		}
		if (f >= Math.floor(a.display.gutters.getBoundingClientRect().right)) return !1
		d && O(b)
		d = a.display
		var k = d.lineDiv.getBoundingClientRect()
		if (g > k.bottom || !S(a, c)) return ld(b)
		g -= k.top - d.viewOffset
		for (k = 0; k < a.options.gutters.length; ++k) {
			var l = d.gutters.childNodes[k]
			if (l && l.getBoundingClientRect().right >= f) return (f = Ba(a.doc, g)), e(a, c, a, f, a.options.gutters[k], b), ld(b)
		}
	}
	function Hf(a) {
		var b = this
		if (!ja(b, a) && !oa(b.display, a)) {
			O(a)
			B && (se = +new Date())
			var c = Ua(b, a, !0),
				d = a.dataTransfer.files
			if (c && !Rb(b))
				if (d && d.length && window.FileReader && window.File) {
					var e = d.length,
						f = Array(e),
						g = 0
					a = function (a, d) {
						var h = new FileReader()
						h.onload = G(b, function () {
							f[d] = h.result
							if (++g == e) {
								c = w(b.doc, c)
								var a = { from: c, to: c, text: sa(f.join("\n")), origin: "paste" }
								Oa(b.doc, a)
								be(b.doc, ga(c, ta(a)))
							}
						})
						h.readAsText(a)
					}
					for (var h = 0; h < e; ++h) a(d[h], h)
				} else if (b.state.draggingText && -1 < b.doc.sel.contains(c))
					b.state.draggingText(a),
						setTimeout(function () {
							b.display.input.focus()
						}, 20)
				else
					try {
						if ((f = a.dataTransfer.getData("Text"))) {
							if (b.state.draggingText && (W ? !a.altKey : !a.ctrlKey)) var k = b.listSelections()
							Vb(b.doc, ga(c, c))
							if (k) for (h = 0; h < k.length; ++h) wb(b.doc, "", k[h].anchor, k[h].head, "drag")
							b.replaceSelection(f, "around", "paste")
							b.display.input.focus()
						}
					} catch (l) {}
		}
	}
	function lb(a, b) {
		2 > Math.abs(a.doc.scrollTop - b) || ((a.doc.scrollTop = b), wa || Pc(a, { top: b }), a.display.scroller.scrollTop != b && (a.display.scroller.scrollTop = b), a.display.scrollbars.setScrollTop(b), wa && Pc(a), fb(a, 100))
	}
	function Ma(a, b, c) {
		;(c ? b == a.doc.scrollLeft : 2 > Math.abs(a.doc.scrollLeft - b)) || ((b = Math.min(b, a.display.scroller.scrollWidth - a.display.scroller.clientWidth)), (a.doc.scrollLeft = b), Bc(a), a.display.scroller.scrollLeft != b && (a.display.scroller.scrollLeft = b), a.display.scrollbars.setScrollLeft(b))
	}
	function re(a, b) {
		var c = ze(b),
			d = c.x,
			c = c.y,
			e = a.display,
			f = e.scroller
		if ((d && f.scrollWidth > f.clientWidth) || (c && f.scrollHeight > f.clientHeight)) {
			if (c && W && J) {
				var g = b.target,
					h = e.view
				a: for (; g != f; g = g.parentNode)
					for (var k = 0; k < h.length; k++)
						if (h[k].node == g) {
							a.display.currentWheelTarget = g
							break a
						}
			}
			!d || wa || ba || null == R
				? (c && null != R && ((g = c * R), (h = a.doc.scrollTop), (k = h + e.wrapper.clientHeight), 0 > g ? (h = Math.max(0, h + g - 50)) : (k = Math.min(a.doc.height, k + g + 50)), Pc(a, { top: h, bottom: k })),
				  20 > gc &&
						(null == e.wheelStartX
							? ((e.wheelStartX = f.scrollLeft),
							  (e.wheelStartY = f.scrollTop),
							  (e.wheelDX = d),
							  (e.wheelDY = c),
							  setTimeout(function () {
									if (null != e.wheelStartX) {
										var a = f.scrollLeft - e.wheelStartX,
											b = f.scrollTop - e.wheelStartY,
											a = (b && e.wheelDY && b / e.wheelDY) || (a && e.wheelDX && a / e.wheelDX)
										e.wheelStartX = e.wheelStartY = null
										a && ((R = (R * gc + a) / (gc + 1)), ++gc)
									}
							  }, 200))
							: ((e.wheelDX += d), (e.wheelDY += c))))
				: (c && lb(a, Math.max(0, Math.min(f.scrollTop + c * R, f.scrollHeight - f.clientHeight))), Ma(a, Math.max(0, Math.min(f.scrollLeft + d * R, f.scrollWidth - f.clientWidth))), O(b), (e.wheelStartX = null))
		}
	}
	function hc(a, b, c) {
		if ("string" == typeof b && ((b = ic[b]), !b)) return !1
		a.display.input.ensurePolled()
		var d = a.display.shift,
			e = !1
		try {
			Rb(a) && (a.state.suppressEdits = !0), c && (a.display.shift = !1), (e = b(a) != Ae)
		} finally {
			;(a.display.shift = d), (a.state.suppressEdits = !1)
		}
		return e
	}
	function Of(a, b, c) {
		for (var d = 0; d < a.state.keyMaps.length; d++) {
			var e = xb(b, a.state.keyMaps[d], c, a)
			if (e) return e
		}
		return (a.options.extraKeys && xb(b, a.options.extraKeys, c, a)) || xb(b, a.options.keyMap, c, a)
	}
	function jc(a, b, c, d) {
		var e = a.state.keySeq
		if (e) {
			if (Pf(b)) return "handled"
			Qf.set(50, function () {
				a.state.keySeq == e && ((a.state.keySeq = null), a.display.input.reset())
			})
			b = e + " " + b
		}
		d = Of(a, b, d)
		"multi" == d && (a.state.keySeq = b)
		"handled" == d && L(a, "keyHandled", a, b, c)
		if ("handled" == d || "multi" == d) O(c), Yc(a)
		return e && !d && /\'$/.test(b) ? (O(c), !0) : !!d
	}
	function Be(a, b) {
		var c = Rf(b, !0)
		return c
			? b.shiftKey && !a.state.keySeq
				? jc(a, "Shift-" + c, b, function (b) {
						return hc(a, b, !0)
				  }) ||
				  jc(a, c, b, function (b) {
						if ("string" == typeof b ? /^go[A-Z]/.test(b) : b.motion) return hc(a, b)
				  })
				: jc(a, c, b, function (b) {
						return hc(a, b)
				  })
			: !1
	}
	function Sf(a, b, c) {
		return jc(a, "'" + c + "'", b, function (b) {
			return hc(a, b, !0)
		})
	}
	function ve(a) {
		this.curOp.focus = fa()
		if (!ja(this, a)) {
			B && 11 > C && 27 == a.keyCode && (a.returnValue = !1)
			var b = a.keyCode
			this.display.shift = 16 == b || a.shiftKey
			var c = Be(this, a)
			ba && ((md = c ? b : null), !c && 88 == b && !Ce && (W ? a.metaKey : a.ctrlKey) && this.replaceSelection("", null, "cut"))
			18 != b || /\bCodeMirror-crosshair\b/.test(this.display.lineDiv.className) || Tf(this)
		}
	}
	function Tf(a) {
		function b(a) {
			;(18 != a.keyCode && a.altKey) || (kb(c, "CodeMirror-crosshair"), ka(document, "keyup", b), ka(document, "mouseover", b))
		}
		var c = a.display.lineDiv
		mb(c, "CodeMirror-crosshair")
		v(document, "keyup", b)
		v(document, "mouseover", b)
	}
	function ue(a) {
		16 == a.keyCode && (this.doc.sel.shift = !1)
		ja(this, a)
	}
	function we(a) {
		if (!(oa(this.display, a) || ja(this, a) || (a.ctrlKey && !a.altKey) || (W && a.metaKey))) {
			var b = a.keyCode,
				c = a.charCode
			if (ba && b == md) (md = null), O(a)
			else if (!ba || (a.which && !(10 > a.which)) || !Be(this, a)) if (((b = String.fromCharCode(null == c ? b : c)), !Sf(this, a, b))) this.display.input.onKeyPress(a)
		}
	}
	function Kf(a) {
		a.state.delayingBlurEvent = !0
		setTimeout(function () {
			a.state.delayingBlurEvent && ((a.state.delayingBlurEvent = !1), db(a))
		}, 100)
	}
	function xc(a) {
		a.state.delayingBlurEvent && (a.state.delayingBlurEvent = !1)
		"nocursor" != a.options.readOnly &&
			(a.state.focused ||
				(K(a, "focus", a),
				(a.state.focused = !0),
				mb(a.display.wrapper, "CodeMirror-focused"),
				a.curOp ||
					a.display.selForContextMenu == a.doc.sel ||
					(a.display.input.reset(),
					J &&
						setTimeout(function () {
							a.display.input.reset(!0)
						}, 20)),
				a.display.input.receivedFocus()),
			Yc(a))
	}
	function db(a) {
		a.state.delayingBlurEvent ||
			(a.state.focused && (K(a, "blur", a), (a.state.focused = !1), kb(a.display.wrapper, "CodeMirror-focused")),
			clearInterval(a.display.blinker),
			setTimeout(function () {
				a.state.focused || (a.display.shift = !1)
			}, 150))
	}
	function qe(a, b) {
		var c
		;(c = oa(a.display, b)) || (c = S(a, "gutterContextMenu") ? hd(a, b, "gutterContextMenu", !1, K) : !1)
		if (!c) a.display.input.onContextMenu(b)
	}
	function De(a, b) {
		if (0 > y(a, b.from)) return a
		if (0 >= y(a, b.to)) return ta(b)
		var c = a.line + b.text.length - (b.to.line - b.from.line) - 1,
			d = a.ch
		a.line == b.to.line && (d += ta(b).ch - b.to.ch)
		return r(c, d)
	}
	function nd(a, b) {
		for (var c = [], d = 0; d < a.sel.ranges.length; d++) {
			var e = a.sel.ranges[d]
			c.push(new z(De(e.anchor, b), De(e.head, b)))
		}
		return Z(c, a.sel.primIndex)
	}
	function Ee(a, b, c) {
		return a.line == b.line ? r(c.line, a.ch - b.ch + c.ch) : r(c.line + (a.line - b.line), a.ch)
	}
	function Fe(a, b, c) {
		b = {
			canceled: !1,
			from: b.from,
			to: b.to,
			text: b.text,
			origin: b.origin,
			cancel: function () {
				this.canceled = !0
			}
		}
		c &&
			(b.update = function (b, c, f, g) {
				b && (this.from = w(a, b))
				c && (this.to = w(a, c))
				f && (this.text = f)
				void 0 !== g && (this.origin = g)
			})
		K(a, "beforeChange", a, b)
		a.cm && K(a.cm, "beforeChange", a.cm, b)
		return b.canceled ? null : { from: b.from, to: b.to, text: b.text, origin: b.origin }
	}
	function Oa(a, b, c) {
		if (a.cm) {
			if (!a.cm.curOp) return G(a.cm, Oa)(a, b, c)
			if (a.cm.state.suppressEdits) return
		}
		if (S(a, "beforeChange") || (a.cm && S(a.cm, "beforeChange"))) if (((b = Fe(a, b, !0)), !b)) return
		if ((c = Ge && !c && Uf(a, b.from, b.to))) for (var d = c.length - 1; 0 <= d; --d) He(a, { from: c[d].from, to: c[d].to, text: d ? [""] : b.text })
		else He(a, b)
	}
	function He(a, b) {
		if (1 != b.text.length || "" != b.text[0] || 0 != y(b.from, b.to)) {
			var c = nd(a, b)
			Ie(a, b, c, a.cm ? a.cm.curOp.id : NaN)
			yb(a, b, c, od(a, b))
			var d = []
			Ga(a, function (a, c) {
				c || -1 != D(d, a.history) || (Je(a.history, b), d.push(a.history))
				yb(a, b, null, od(a, b))
			})
		}
	}
	function kc(a, b, c) {
		if (!a.cm || !a.cm.state.suppressEdits) {
			for (var d = a.history, e, f = a.sel, g = "undo" == b ? d.done : d.undone, h = "undo" == b ? d.undone : d.done, k = 0; k < g.length && ((e = g[k]), c ? !e.ranges || e.equals(a.sel) : e.ranges); k++);
			if (k != g.length) {
				for (d.lastOrigin = d.lastSelOrigin = null; ; )
					if (((e = g.pop()), e.ranges)) {
						Wb(e, h)
						if (c && !e.equals(a.sel)) {
							H(a, e, { clearRedo: !1 })
							return
						}
						f = e
					} else break
				c = []
				Wb(f, h)
				h.push({ changes: c, generation: d.generation })
				d.generation = e.generation || ++d.maxGeneration
				d = S(a, "beforeChange") || (a.cm && S(a.cm, "beforeChange"))
				for (k = e.changes.length - 1; 0 <= k; --k) {
					var l = e.changes[k]
					l.origin = b
					if (d && !Fe(a, l, !1)) {
						g.length = 0
						break
					}
					c.push(pd(a, l))
					f = k ? nd(a, l) : A(g)
					yb(a, l, f, Ke(a, l))
					!k && a.cm && a.cm.scrollIntoView({ from: l.from, to: ta(l) })
					var m = []
					Ga(a, function (a, b) {
						b || -1 != D(m, a.history) || (Je(a.history, l), m.push(a.history))
						yb(a, l, null, Ke(a, l))
					})
				}
			}
		}
	}
	function Le(a, b) {
		if (
			0 != b &&
			((a.first += b),
			(a.sel = new la(
				ob(a.sel.ranges, function (a) {
					return new z(r(a.anchor.line + b, a.anchor.ch), r(a.head.line + b, a.head.ch))
				}),
				a.sel.primIndex
			)),
			a.cm)
		) {
			Q(a.cm, a.first, a.first - b, b)
			for (var c = a.cm.display, d = c.viewFrom; d < c.viewTo; d++) na(a.cm, d, "gutter")
		}
	}
	function yb(a, b, c, d) {
		if (a.cm && !a.cm.curOp) return G(a.cm, yb)(a, b, c, d)
		if (b.to.line < a.first) Le(a, b.text.length - 1 - (b.to.line - b.from.line))
		else if (!(b.from.line > a.lastLine())) {
			if (b.from.line < a.first) {
				var e = b.text.length - 1 - (a.first - b.from.line)
				Le(a, e)
				b = { from: r(a.first, 0), to: r(b.to.line + e, b.to.ch), text: [A(b.text)], origin: b.origin }
			}
			e = a.lastLine()
			b.to.line > e && (b = { from: b.from, to: r(e, u(a, e).text.length), text: [b.text[0]], origin: b.origin })
			b.removed = Da(a, b.from, b.to)
			c || (c = nd(a, b))
			a.cm ? Vf(a.cm, b, d) : qd(a, b, d)
			Vb(a, c, ha)
		}
	}
	function Vf(a, b, c) {
		var d = a.doc,
			e = a.display,
			f = b.from,
			g = b.to,
			h = !1,
			k = f.line
		a.options.lineWrapping ||
			((k = F(ia(u(d, f.line)))),
			d.iter(k, g.line + 1, function (a) {
				if (a == e.maxLine) return (h = !0)
			}))
		;-1 < d.sel.contains(b.from, b.to) && fe(a)
		qd(d, b, c, Id(a))
		a.options.lineWrapping ||
			(d.iter(k, f.line + b.text.length, function (a) {
				var b = Kb(a)
				b > e.maxLineLength && ((e.maxLine = a), (e.maxLineLength = b), (e.maxLineChanged = !0), (h = !1))
			}),
			h && (a.curOp.updateMaxLine = !0))
		d.frontier = Math.min(d.frontier, f.line)
		fb(a, 400)
		c = b.text.length - (g.line - f.line) - 1
		b.full ? Q(a) : f.line != g.line || 1 != b.text.length || Me(a.doc, b) ? Q(a, f.line, g.line + 1, c) : na(a, f.line, "text")
		c = S(a, "changes")
		if ((d = S(a, "change")) || c) (b = { from: f, to: g, text: b.text, removed: b.removed, origin: b.origin }), d && L(a, "change", a, b), c && (a.curOp.changeObjs || (a.curOp.changeObjs = [])).push(b)
		a.display.selForContextMenu = null
	}
	function wb(a, b, c, d, e) {
		d || (d = c)
		if (0 > y(d, c)) {
			var f = d
			d = c
			c = f
		}
		"string" == typeof b && (b = sa(b))
		Oa(a, { from: c, to: d, text: b, origin: e })
	}
	function cc(a, b, c, d, e) {
		var f = a.display,
			g = xa(a.display)
		0 > c && (c = 0)
		var h = a.curOp && null != a.curOp.scrollTop ? a.curOp.scrollTop : f.scroller.scrollTop,
			k = Nc(a),
			l = {}
		e - c > k && (e = c + k)
		var m = a.doc.height + Ec(f),
			p = c < g,
			g = e > m - g
		c < h ? (l.scrollTop = p ? 0 : c) : e > h + k && ((c = Math.min(c, (g ? m : e) - k)), c != h && (l.scrollTop = c))
		h = a.curOp && null != a.curOp.scrollLeft ? a.curOp.scrollLeft : f.scroller.scrollLeft
		a = pa(a) - (a.options.fixedGutter ? f.gutters.offsetWidth : 0)
		;(f = d - b > a) && (d = b + a)
		10 > b ? (l.scrollLeft = 0) : b < h ? (l.scrollLeft = Math.max(0, b - (f ? 0 : 10))) : d > a + h - 3 && (l.scrollLeft = d + (f ? 0 : 10) - a)
		return l
	}
	function lc(a, b, c) {
		;(null == b && null == c) || mc(a)
		null != b && (a.curOp.scrollLeft = (null == a.curOp.scrollLeft ? a.doc.scrollLeft : a.curOp.scrollLeft) + b)
		null != c && (a.curOp.scrollTop = (null == a.curOp.scrollTop ? a.doc.scrollTop : a.curOp.scrollTop) + c)
	}
	function Pa(a) {
		mc(a)
		var b = a.getCursor(),
			c = b,
			d = b
		a.options.lineWrapping || ((c = b.ch ? r(b.line, b.ch - 1) : b), (d = r(b.line, b.ch + 1)))
		a.curOp.scrollToPos = { from: c, to: d, margin: a.options.cursorScrollMargin, isCursor: !0 }
	}
	function mc(a) {
		var b = a.curOp.scrollToPos
		if (b) {
			a.curOp.scrollToPos = null
			var c = oe(a, b.from),
				d = oe(a, b.to),
				b = cc(a, Math.min(c.left, d.left), Math.min(c.top, d.top) - b.margin, Math.max(c.right, d.right), Math.max(c.bottom, d.bottom) + b.margin)
			a.scrollTo(b.scrollLeft, b.scrollTop)
		}
	}
	function pb(a, b, c, d) {
		var e = a.doc,
			f
		null == c && (c = "add")
		"smart" == c && (e.mode.indent ? (f = sb(a, b)) : (c = "prev"))
		var g = a.options.tabSize,
			h = u(e, b),
			k = aa(h.text, null, g)
		h.stateAfter && (h.stateAfter = null)
		var l = h.text.match(/^\s*/)[0],
			m
		if (!d && !/\S/.test(h.text)) (m = 0), (c = "not")
		else if ("smart" == c && ((m = e.mode.indent(f, h.text.slice(l.length), h.text)), m == Ae || 150 < m)) {
			if (!d) return
			c = "prev"
		}
		"prev" == c ? (m = b > e.first ? aa(u(e, b - 1).text, null, g) : 0) : "add" == c ? (m = k + a.options.indentUnit) : "subtract" == c ? (m = k - a.options.indentUnit) : "number" == typeof c && (m = k + c)
		m = Math.max(0, m)
		c = ""
		d = 0
		if (a.options.indentWithTabs) for (a = Math.floor(m / g); a; --a) (d += g), (c += "\t")
		d < m && (c += Ne(m - d))
		if (c != l) return wb(e, c, r(b, 0), r(b, l.length), "+input"), (h.stateAfter = null), !0
		for (a = 0; a < e.sel.ranges.length; a++)
			if (((g = e.sel.ranges[a]), g.head.line == b && g.head.ch < l.length)) {
				d = r(b, l.length)
				Xc(e, a, new z(d, d))
				break
			}
	}
	function nc(a, b, c, d) {
		var e = b,
			f = b
		"number" == typeof b ? (f = u(a, Math.max(a.first, Math.min(b, a.first + a.size - 1)))) : (e = F(b))
		if (null == e) return null
		d(f, e) && a.cm && na(a.cm, e, c)
		return f
	}
	function Va(a, b) {
		for (var c = a.doc.sel.ranges, d = [], e = 0; e < c.length; e++) {
			for (var f = b(c[e]); d.length && 0 >= y(f.from, A(d).to); ) {
				var g = d.pop()
				if (0 > y(g.from, f.from)) {
					f.from = g.from
					break
				}
			}
			d.push(f)
		}
		T(a, function () {
			for (var b = d.length - 1; 0 <= b; b--) wb(a.doc, "", d[b].from, d[b].to, "+delete")
			Pa(a)
		})
	}
	function rd(a, b, c, d, e) {
		function f(b) {
			var d = (e ? gd : Oe)(l, h, c, !0)
			if (null == d) {
				if ((b = !b)) (b = g + c), b < a.first || b >= a.first + a.size ? (b = m = !1) : ((g = b), (b = l = u(a, b)))
				if (b) h = e ? (0 > c ? bc : ac)(l) : 0 > c ? l.text.length : 0
				else return (m = !1)
			} else h = d
			return !0
		}
		var g = b.line,
			h = b.ch,
			k = c,
			l = u(a, g),
			m = !0
		if ("char" == d) f()
		else if ("column" == d) f(!0)
		else if ("word" == d || "group" == d) {
			var p = null
			d = "group" == d
			b = a.cm && a.cm.getHelper(b, "wordChars")
			for (var n = !0; !(0 > c) || f(!n); n = !1) {
				var q = l.text.charAt(h) || "\n",
					q = oc(q, b) ? "w" : d && "\n" == q ? "n" : !d || /\s/.test(q) ? null : "p"
				!d || n || q || (q = "s")
				if (p && p != q) {
					0 > c && ((c = 1), f())
					break
				}
				q && (p = q)
				if (0 < c && !f(!n)) break
			}
		}
		k = Xb(a, r(g, h), k, !0)
		m || (k.hitSide = !0)
		return k
	}
	function Pe(a, b, c, d) {
		var e = a.doc,
			f = b.left,
			g
		"page" == d ? ((g = Math.min(a.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight)), (g = b.top + c * (g - (0 > c ? 1.5 : 0.5) * xa(a.display)))) : "line" == d && (g = 0 < c ? b.bottom + 3 : b.top - 3)
		for (;;) {
			b = fd(a, f, g)
			if (!b.outside) break
			if (0 > c ? 0 >= g : g >= e.height) {
				b.hitSide = !0
				break
			}
			g += 5 * c
		}
		return b
	}
	function x(a, b, c, d) {
		q.defaults[a] = b
		c &&
			(Ka[a] = d
				? function (a, b, d) {
						d != Fd && c(a, b, d)
				  }
				: c)
	}
	function Wf(a) {
		var b = a.split(/-(?!$)/)
		a = b[b.length - 1]
		for (var c, d, e, f, g = 0; g < b.length - 1; g++) {
			var h = b[g]
			if (/^(cmd|meta|m)$/i.test(h)) f = !0
			else if (/^a(lt)?$/i.test(h)) c = !0
			else if (/^(c|ctrl|control)$/i.test(h)) d = !0
			else if (/^s(hift)$/i.test(h)) e = !0
			else throw Error("Unrecognized modifier name: " + h)
		}
		c && (a = "Alt-" + a)
		d && (a = "Ctrl-" + a)
		f && (a = "Cmd-" + a)
		e && (a = "Shift-" + a)
		return a
	}
	function pc(a) {
		return "string" == typeof a ? ua[a] : a
	}
	function Wa(a, b, c, d, e) {
		if (d && d.shared) return Xf(a, b, c, d, e)
		if (a.cm && !a.cm.curOp) return G(a.cm, Wa)(a, b, c, d, e)
		var f = new Ha(a, e)
		e = y(b, c)
		d && V(d, f, !1)
		if (0 < e || (0 == e && !1 !== f.clearWhenEmpty)) return f
		f.replacedWith && ((f.collapsed = !0), (f.widgetNode = t("span", [f.replacedWith], "CodeMirror-widget")), d.handleMouseEvents || f.widgetNode.setAttribute("cm-ignore-events", "true"), d.insertLeft && (f.widgetNode.insertLeft = !0))
		if (f.collapsed) {
			if (Qe(a, b.line, b, c, f) || (b.line != c.line && Qe(a, c.line, b, c, f))) throw Error("Inserting collapsed marker partially overlapping an existing one")
			ra = !0
		}
		f.addToHistory && Ie(a, { from: b, to: c, origin: "markText" }, a.sel, NaN)
		var g = b.line,
			h = a.cm,
			k
		a.iter(g, c.line + 1, function (a) {
			h && f.collapsed && !h.options.lineWrapping && ia(a) == h.display.maxLine && (k = !0)
			f.collapsed && g != b.line && ca(a, 0)
			var d = new qc(f, g == b.line ? b.ch : null, g == c.line ? c.ch : null)
			a.markedSpans = a.markedSpans ? a.markedSpans.concat([d]) : [d]
			d.marker.attachLine(a)
			++g
		})
		f.collapsed &&
			a.iter(b.line, c.line + 1, function (b) {
				ya(a, b) && ca(b, 0)
			})
		f.clearOnEnter &&
			v(f, "beforeCursorEnter", function () {
				f.clear()
			})
		f.readOnly && ((Ge = !0), (a.history.done.length || a.history.undone.length) && a.clearHistory())
		f.collapsed && ((f.id = ++sd), (f.atomic = !0))
		if (h) {
			k && (h.curOp.updateMaxLine = !0)
			if (f.collapsed) Q(h, b.line, c.line + 1)
			else if (f.className || f.title || f.startStyle || f.endStyle || f.css) for (d = b.line; d <= c.line; d++) na(h, d, "text")
			f.atomic && ge(h.doc)
			L(h, "markerAdded", h, f)
		}
		return f
	}
	function Xf(a, b, c, d, e) {
		d = V(d)
		d.shared = !1
		var f = [Wa(a, b, c, d, e)],
			g = f[0],
			h = d.widgetNode
		Ga(a, function (a) {
			h && (d.widgetNode = h.cloneNode(!0))
			f.push(Wa(a, w(a, b), w(a, c), d, e))
			for (var l = 0; l < a.linked.length; ++l) if (a.linked[l].isParent) return
			g = A(f)
		})
		return new rc(f, g)
	}
	function Re(a) {
		return a.findMarks(r(a.first, 0), a.clipPos(r(a.lastLine())), function (a) {
			return a.parent
		})
	}
	function Yf(a) {
		for (var b = 0; b < a.length; b++) {
			var c = a[b],
				d = [c.primary.doc]
			Ga(c.primary.doc, function (a) {
				d.push(a)
			})
			for (var e = 0; e < c.markers.length; e++) {
				var f = c.markers[e]
				;-1 == D(d, f.doc) && ((f.parent = null), c.markers.splice(e--, 1))
			}
		}
	}
	function qc(a, b, c) {
		this.marker = a
		this.from = b
		this.to = c
	}
	function zb(a, b) {
		if (a)
			for (var c = 0; c < a.length; ++c) {
				var d = a[c]
				if (d.marker == b) return d
			}
	}
	function od(a, b) {
		if (b.full) return null
		var c = qb(a, b.from.line) && u(a, b.from.line).markedSpans,
			d = qb(a, b.to.line) && u(a, b.to.line).markedSpans
		if (!c && !d) return null
		var e = b.from.ch,
			f = b.to.ch,
			g = 0 == y(b.from, b.to)
		if (c)
			for (var h = 0, k; h < c.length; ++h) {
				var l = c[h],
					m = l.marker
				if (null == l.from || (m.inclusiveLeft ? l.from <= e : l.from < e) || !(l.from != e || "bookmark" != m.type || (g && l.marker.insertLeft))) {
					var p = null == l.to || (m.inclusiveRight ? l.to >= e : l.to > e)
					;(k || (k = [])).push(new qc(m, l.from, p ? null : l.to))
				}
			}
		c = k
		if (d) for (var h = 0, n; h < d.length; ++h) if (((k = d[h]), (l = k.marker), null == k.to || (l.inclusiveRight ? k.to >= f : k.to > f) || (k.from == f && "bookmark" == l.type && (!g || k.marker.insertLeft)))) (m = null == k.from || (l.inclusiveLeft ? k.from <= f : k.from < f)), (n || (n = [])).push(new qc(l, m ? null : k.from - f, null == k.to ? null : k.to - f))
		d = n
		g = 1 == b.text.length
		n = A(b.text).length + (g ? e : 0)
		if (c) for (f = 0; f < c.length; ++f) if (((h = c[f]), null == h.to)) ((k = zb(d, h.marker)), k) ? g && (h.to = null == k.to ? null : k.to + n) : (h.to = e)
		if (d) for (f = 0; f < d.length; ++f) (h = d[f]), null != h.to && (h.to += n), null == h.from ? ((k = zb(c, h.marker)), k || ((h.from = n), g && (c || (c = [])).push(h))) : ((h.from += n), g && (c || (c = [])).push(h))
		c && (c = Se(c))
		d && d != c && (d = Se(d))
		e = [c]
		if (!g) {
			var g = b.text.length - 2,
				q
			if (0 < g && c) for (f = 0; f < c.length; ++f) null == c[f].to && (q || (q = [])).push(new qc(c[f].marker, null, null))
			for (f = 0; f < g; ++f) e.push(q)
			e.push(d)
		}
		return e
	}
	function Se(a) {
		for (var b = 0; b < a.length; ++b) {
			var c = a[b]
			null != c.from && c.from == c.to && !1 !== c.marker.clearWhenEmpty && a.splice(b--, 1)
		}
		return a.length ? a : null
	}
	function Ke(a, b) {
		var c
		if ((c = b["spans_" + a.id])) {
			for (var d = 0, e = []; d < b.text.length; ++d) e.push(Zf(c[d]))
			c = e
		} else c = null
		d = od(a, b)
		if (!c) return d
		if (!d) return c
		for (e = 0; e < c.length; ++e) {
			var f = c[e],
				g = d[e]
			if (f && g) {
				var h = 0
				a: for (; h < g.length; ++h) {
					for (var k = g[h], l = 0; l < f.length; ++l) if (f[l].marker == k.marker) continue a
					f.push(k)
				}
			} else g && (c[e] = g)
		}
		return c
	}
	function Uf(a, b, c) {
		var d = null
		a.iter(b.line, c.line + 1, function (a) {
			if (a.markedSpans)
				for (var b = 0; b < a.markedSpans.length; ++b) {
					var c = a.markedSpans[b].marker
					!c.readOnly || (d && -1 != D(d, c)) || (d || (d = [])).push(c)
				}
		})
		if (!d) return null
		a = [{ from: b, to: c }]
		for (b = 0; b < d.length; ++b) {
			c = d[b]
			for (var e = c.find(0), f = 0; f < a.length; ++f) {
				var g = a[f]
				if (!(0 > y(g.to, e.from) || 0 < y(g.from, e.to))) {
					var h = [f, 1],
						k = y(g.from, e.from),
						l = y(g.to, e.to)
					;(0 > k || (!c.inclusiveLeft && !k)) && h.push({ from: g.from, to: e.from })
					;(0 < l || (!c.inclusiveRight && !l)) && h.push({ from: e.to, to: g.to })
					a.splice.apply(a, h)
					f += h.length - 1
				}
			}
		}
		return a
	}
	function Te(a) {
		var b = a.markedSpans
		if (b) {
			for (var c = 0; c < b.length; ++c) b[c].marker.detachLine(a)
			a.markedSpans = null
		}
	}
	function Ue(a, b) {
		if (b) {
			for (var c = 0; c < b.length; ++c) b[c].marker.attachLine(a)
			a.markedSpans = b
		}
	}
	function Ve(a, b) {
		var c = a.lines.length - b.lines.length
		if (0 != c) return c
		var c = a.find(),
			d = b.find(),
			e = y(c.from, d.from) || (a.inclusiveLeft ? -1 : 0) - (b.inclusiveLeft ? -1 : 0)
		return e ? -e : (c = y(c.to, d.to) || (a.inclusiveRight ? 1 : 0) - (b.inclusiveRight ? 1 : 0)) ? c : b.id - a.id
	}
	function Aa(a, b) {
		var c = ra && a.markedSpans,
			d
		if (c) for (var e, f = 0; f < c.length; ++f) (e = c[f]), e.marker.collapsed && null == (b ? e.from : e.to) && (!d || 0 > Ve(d, e.marker)) && (d = e.marker)
		return d
	}
	function Qe(a, b, c, d, e) {
		a = u(a, b)
		if ((a = ra && a.markedSpans))
			for (b = 0; b < a.length; ++b) {
				var f = a[b]
				if (f.marker.collapsed) {
					var g = f.marker.find(0),
						h = y(g.from, c) || (f.marker.inclusiveLeft ? -1 : 0) - (e.inclusiveLeft ? -1 : 0),
						k = y(g.to, d) || (f.marker.inclusiveRight ? 1 : 0) - (e.inclusiveRight ? 1 : 0)
					if (!((0 <= h && 0 >= k) || (0 >= h && 0 <= k)) && ((0 >= h && (0 < y(g.to, c) || (f.marker.inclusiveRight && e.inclusiveLeft))) || (0 <= h && (0 > y(g.from, d) || (f.marker.inclusiveLeft && e.inclusiveRight))))) return !0
				}
			}
	}
	function ia(a) {
		for (var b; (b = Aa(a, !0)); ) a = b.find(-1, !0).line
		return a
	}
	function Mc(a, b) {
		var c = u(a, b),
			d = ia(c)
		return c == d ? b : F(d)
	}
	function Ld(a, b) {
		if (b > a.lastLine()) return b
		var c = u(a, b),
			d
		if (!ya(a, c)) return b
		for (; (d = Aa(c, !1)); ) c = d.find(1, !0).line
		return F(c) + 1
	}
	function ya(a, b) {
		var c = ra && b.markedSpans
		if (c) for (var d, e = 0; e < c.length; ++e) if (((d = c[e]), d.marker.collapsed && (null == d.from || (!d.marker.widgetNode && 0 == d.from && d.marker.inclusiveLeft && td(a, b, d))))) return !0
	}
	function td(a, b, c) {
		if (null == c.to) return (b = c.marker.find(1, !0)), td(a, b.line, zb(b.line.markedSpans, c.marker))
		if (c.marker.inclusiveRight && c.to == b.text.length) return !0
		for (var d, e = 0; e < b.markedSpans.length; ++e) if (((d = b.markedSpans[e]), d.marker.collapsed && !d.marker.widgetNode && d.from == c.to && (null == d.to || d.to != c.from) && (d.marker.inclusiveLeft || c.marker.inclusiveRight) && td(a, b, d))) return !0
	}
	function ub(a) {
		if (null != a.height) return a.height
		var b = a.doc.cm
		if (!b) return 0
		if (!Wc(document.body, a.node)) {
			var c = "position: relative;"
			a.coverGutter && (c += "margin-left: -" + b.display.gutters.offsetWidth + "px;")
			a.noHScroll && (c += "width: " + b.display.wrapper.clientWidth + "px;")
			U(b.display.measure, t("div", [a.node], null, c))
		}
		return (a.height = a.node.offsetHeight)
	}
	function $f(a, b, c, d) {
		var e = new sc(a, c, d),
			f = a.cm
		f && e.noHScroll && (f.display.alignWidgets = !0)
		nc(a, b, "widget", function (b) {
			var c = b.widgets || (b.widgets = [])
			null == e.insertAt ? c.push(e) : c.splice(Math.min(c.length - 1, Math.max(0, e.insertAt)), 0, e)
			e.line = b
			f && !ya(a, b) && ((c = ea(b) < a.scrollTop), ca(b, b.height + ub(e)), c && lc(f, null, e.height), (f.curOp.forceUpdate = !0))
			return !0
		})
		return e
	}
	function We(a, b) {
		if (a)
			for (;;) {
				var c = a.match(/(?:^|\s+)line-(background-)?(\S+)/)
				if (!c) break
				a = a.slice(0, c.index) + a.slice(c.index + c[0].length)
				var d = c[1] ? "bgClass" : "textClass"
				null == b[d] ? (b[d] = c[2]) : new RegExp("(?:^|s)" + c[2] + "(?:$|s)").test(b[d]) || (b[d] += " " + c[2])
			}
		return a
	}
	function Xe(a, b) {
		if (a.blankLine) return a.blankLine(b)
		if (a.innerMode) {
			var c = q.innerMode(a, b)
			if (c.mode.blankLine) return c.mode.blankLine(c.state)
		}
	}
	function ud(a, b, c, d) {
		for (var e = 0; 10 > e; e++) {
			d && (d[0] = q.innerMode(a, c).mode)
			var f = a.token(b, c)
			if (b.pos > b.start) return f
		}
		throw Error("Mode " + a.name + " failed to advance stream.")
	}
	function Ye(a, b, c, d) {
		function e(a) {
			return { start: m.start, end: m.pos, string: m.current(), type: h || null, state: a ? Sa(f.mode, l) : l }
		}
		var f = a.doc,
			g = f.mode,
			h
		b = w(f, b)
		var k = u(f, b.line),
			l = sb(a, b.line, c),
			m = new tc(k.text, a.options.tabSize),
			p
		for (d && (p = []); (d || m.pos < b.ch) && !m.eol(); ) (m.start = m.pos), (h = ud(g, m, l)), d && p.push(e(!0))
		return d ? p : e()
	}
	function Ze(a, b, c, d, e, f, g) {
		var h = c.flattenSpans
		null == h && (h = a.options.flattenSpans)
		var k = 0,
			l = null,
			m = new tc(b, a.options.tabSize),
			p,
			n = a.options.addModeClass && [null]
		for ("" == b && We(Xe(c, d), f); !m.eol(); ) {
			m.pos > a.options.maxHighlightLength ? ((h = !1), g && Zc(a, b, d, m.pos), (m.pos = b.length), (p = null)) : (p = We(ud(c, m, d, n), f))
			if (n) {
				var q = n[0].name
				q && (p = "m-" + (p ? q + " " + p : q))
			}
			if (!h || l != p) {
				for (; k < m.start; ) (k = Math.min(m.start, k + 5e4)), e(k, l)
				l = p
			}
			m.start = m.pos
		}
		for (; k < m.pos; ) (a = Math.min(m.pos, k + 5e4)), e(a, l), (k = a)
	}
	function je(a, b, c, d) {
		var e = [a.state.modeGen],
			f = {}
		Ze(
			a,
			b.text,
			a.doc.mode,
			c,
			function (a, b) {
				e.push(a, b)
			},
			f,
			d
		)
		for (c = 0; c < a.state.overlays.length; ++c) {
			var g = a.state.overlays[c],
				h = 1,
				k = 0
			Ze(
				a,
				b.text,
				g.mode,
				!0,
				function (a, b) {
					for (var c = h; k < a; ) {
						var d = e[h]
						d > a && e.splice(h, 1, a, e[h + 1], d)
						h += 2
						k = Math.min(a, d)
					}
					if (b)
						if (g.opaque) e.splice(c, h - c, a, "cm-overlay " + b), (h = c + 2)
						else for (; c < h; c += 2) (d = e[c + 1]), (e[c + 1] = (d ? d + " " : "") + "cm-overlay " + b)
				},
				f
			)
		}
		return { styles: e, classes: f.bgClass || f.textClass ? f : null }
	}
	function $e(a, b, c) {
		if (!b.styles || b.styles[0] != a.state.modeGen) {
			var d = je(a, b, (b.stateAfter = sb(a, F(b))))
			b.styles = d.styles
			d.classes ? (b.styleClasses = d.classes) : b.styleClasses && (b.styleClasses = null)
			c === a.doc.frontier && a.doc.frontier++
		}
		return b.styles
	}
	function Zc(a, b, c, d) {
		var e = a.doc.mode,
			f = new tc(b, a.options.tabSize)
		f.start = f.pos = d || 0
		for ("" == b && Xe(e, c); !f.eol() && f.pos <= a.options.maxHighlightLength; ) ud(e, f, c), (f.start = f.pos)
	}
	function af(a, b) {
		if (!a || /^\s*$/.test(a)) return null
		var c = b.addModeClass ? ag : bg
		return c[a] || (c[a] = a.replace(/\S+/g, "cm-$\x26"))
	}
	function Sd(a, b) {
		var c = t("span", null, null, J ? "padding-right: .1px" : null),
			c = { pre: t("pre", [c]), content: c, col: 0, pos: 0, cm: a, splitSpaces: (B || J) && a.getOption("lineWrapping") }
		b.measure = {}
		for (var d = 0; d <= (b.rest ? b.rest.length : 0); d++) {
			var e = d ? b.rest[d - 1] : b.line,
				f
			c.pos = 0
			c.addToken = cg
			var g
			if (null != vd) g = vd
			else {
				g = U(a.display.measure, document.createTextNode("AخA"))
				var h = Ea(g, 0, 1).getBoundingClientRect()
				g = h && h.left != h.right ? (vd = 3 > Ea(g, 1, 2).getBoundingClientRect().right - h.right) : !1
			}
			g && (f = Y(e)) && (c.addToken = dg(c.addToken, f))
			c.map = []
			h = b != a.display.externalMeasured && F(e)
			a: {
				g = c
				var h = $e(a, e, h),
					k = e.markedSpans,
					l = e.text,
					m = 0
				if (k)
					for (var p = l.length, n = 0, q = 1, r = "", u = void 0, v = void 0, w = 0, x = void 0, y = void 0, A = void 0, C = void 0, z = void 0; ; ) {
						if (w == n) {
							for (var x = (y = A = C = v = ""), z = null, w = Infinity, G = [], H = 0; H < k.length; ++H) {
								var I = k[H],
									D = I.marker
								"bookmark" == D.type && I.from == n && D.widgetNode
									? G.push(D)
									: I.from <= n && (null == I.to || I.to > n || (D.collapsed && I.to == n && I.from == n))
									? (null != I.to && I.to != n && w > I.to && ((w = I.to), (y = "")), D.className && (x += " " + D.className), D.css && (v = D.css), D.startStyle && I.from == n && (A += " " + D.startStyle), D.endStyle && I.to == w && (y += " " + D.endStyle), D.title && !C && (C = D.title), D.collapsed && (!z || 0 > Ve(z.marker, D)) && (z = I))
									: I.from > n && w > I.from && (w = I.from)
							}
							if (z && (z.from || 0) == n) {
								bf(g, (null == z.to ? p + 1 : z.to) - n, z.marker, null == z.from)
								if (null == z.to) break a
								z.to == n && (z = !1)
							}
							if (!z && G.length) for (H = 0; H < G.length; ++H) bf(g, 0, G[H])
						}
						if (n >= p) break
						for (G = Math.min(p, w); ; ) {
							if (r) {
								H = n + r.length
								z || ((I = H > G ? r.slice(0, G - n) : r), g.addToken(g, I, u ? u + x : x, A, n + I.length == w ? y : "", C, v))
								if (H >= G) {
									r = r.slice(G - n)
									n = G
									break
								}
								n = H
								A = ""
							}
							r = l.slice(m, (m = h[q++]))
							u = af(h[q++], g.cm.options)
						}
					}
				else for (var q = 1; q < h.length; q += 2) g.addToken(g, l.slice(m, (m = h[q])), af(h[q + 1], g.cm.options))
			}
			e.styleClasses && (e.styleClasses.bgClass && (c.bgClass = wd(e.styleClasses.bgClass, c.bgClass || "")), e.styleClasses.textClass && (c.textClass = wd(e.styleClasses.textClass, c.textClass || "")))
			0 == c.map.length && c.map.push(0, 0, c.content.appendChild(eg(a.display.measure)))
			0 == d ? ((b.measure.map = c.map), (b.measure.cache = {})) : ((b.measure.maps || (b.measure.maps = [])).push(c.map), (b.measure.caches || (b.measure.caches = [])).push({}))
		}
		J && /\bcm-tab\b/.test(c.content.lastChild.className) && (c.content.className = "cm-tab-wrap-hack")
		K(a, "renderLine", a, b.line, c.pre)
		c.pre.className && (c.textClass = wd(c.pre.className, c.textClass || ""))
		return c
	}
	function cg(a, b, c, d, e, f, g) {
		if (b) {
			var h = a.splitSpaces ? b.replace(/ {3,}/g, fg) : b,
				k = a.cm.state.specialChars,
				l = !1
			if (k.test(b))
				for (var m = document.createDocumentFragment(), p = 0; ; ) {
					k.lastIndex = p
					var n = k.exec(b),
						q = n ? n.index - p : b.length - p
					if (q) {
						var r = document.createTextNode(h.slice(p, p + q))
						B && 9 > C ? m.appendChild(t("span", [r])) : m.appendChild(r)
						a.map.push(a.pos, a.pos + q, r)
						a.col += q
						a.pos += q
					}
					if (!n) break
					p += q + 1
					"\t" == n[0] ? ((r = a.cm.options.tabSize), (n = r - (a.col % r)), (r = m.appendChild(t("span", Ne(n), "cm-tab"))), r.setAttribute("role", "presentation"), r.setAttribute("cm-text", "\t"), (a.col += n)) : ((r = a.cm.options.specialCharPlaceholder(n[0])), r.setAttribute("cm-text", n[0]), B && 9 > C ? m.appendChild(t("span", [r])) : m.appendChild(r), (a.col += 1))
					a.map.push(a.pos, a.pos + 1, r)
					a.pos++
				}
			else {
				a.col += b.length
				var m = document.createTextNode(h)
				a.map.push(a.pos, a.pos + b.length, m)
				B && 9 > C && (l = !0)
				a.pos += b.length
			}
			if (c || d || e || l || g) return (b = c || ""), d && (b += d), e && (b += e), (d = t("span", [m], b, g)), f && (d.title = f), a.content.appendChild(d)
			a.content.appendChild(m)
		}
	}
	function fg(a) {
		for (var b = " ", c = 0; c < a.length - 2; ++c) b += c % 2 ? " " : " "
		return b + " "
	}
	function dg(a, b) {
		return function (c, d, e, f, g, h, k) {
			e = e ? e + " cm-force-border" : "cm-force-border"
			for (var l = c.pos, m = l + d.length; ; ) {
				for (var p = 0; p < b.length; p++) {
					var n = b[p]
					if (n.to > l && n.from <= l) break
				}
				if (n.to >= m) return a(c, d, e, f, g, h, k)
				a(c, d.slice(0, n.to - l), e, f, null, h, k)
				f = null
				d = d.slice(n.to - l)
				l = n.to
			}
		}
	}
	function bf(a, b, c, d) {
		var e = !d && c.widgetNode
		e && a.map.push(a.pos, a.pos + b, e)
		!d && a.cm.display.input.needsContentAttribute && (e || (e = a.content.appendChild(document.createElement("span"))), e.setAttribute("cm-marker", c.id))
		e && (a.cm.display.input.setUneditable(e), a.content.appendChild(e))
		a.pos += b
	}
	function Me(a, b) {
		return 0 == b.from.ch && 0 == b.to.ch && "" == A(b.text) && (!a.cm || a.cm.options.wholeLineUpdateBefore)
	}
	function qd(a, b, c, d) {
		function e(a, c, e) {
			a.text = c
			a.stateAfter && (a.stateAfter = null)
			a.styles && (a.styles = null)
			null != a.order && (a.order = null)
			Te(a)
			Ue(a, e)
			c = d ? d(a) : 1
			c != a.height && ca(a, c)
			L(a, "change", a, b)
		}
		function f(a, b) {
			for (var e = a, f = []; e < b; ++e) f.push(new Ab(k[e], c ? c[e] : null, d))
			return f
		}
		var g = b.from,
			h = b.to,
			k = b.text,
			l = u(a, g.line),
			m = u(a, h.line),
			p = A(k),
			n = c ? c[k.length - 1] : null,
			q = h.line - g.line
		if (b.full) a.insert(0, f(0, k.length)), a.remove(k.length, a.size - k.length)
		else if (Me(a, b)) {
			var r = f(0, k.length - 1)
			e(m, m.text, n)
			q && a.remove(g.line, q)
			r.length && a.insert(g.line, r)
		} else
			l == m
				? 1 == k.length
					? e(l, l.text.slice(0, g.ch) + p + l.text.slice(h.ch), n)
					: ((r = f(1, k.length - 1)), r.push(new Ab(p + l.text.slice(h.ch), n, d)), e(l, l.text.slice(0, g.ch) + k[0], c ? c[0] : null), a.insert(g.line + 1, r))
				: 1 == k.length
				? (e(l, l.text.slice(0, g.ch) + k[0] + m.text.slice(h.ch), c ? c[0] : null), a.remove(g.line + 1, q))
				: (e(l, l.text.slice(0, g.ch) + k[0], c ? c[0] : null), e(m, p + m.text.slice(h.ch), n), (r = f(1, k.length - 1)), 1 < q && a.remove(g.line + 1, q - 1), a.insert(g.line + 1, r))
		L(a, "change", a, b)
	}
	function Bb(a) {
		this.lines = a
		this.parent = null
		for (var b = 0, c = 0; b < a.length; ++b) (a[b].parent = this), (c += a[b].height)
		this.height = c
	}
	function Cb(a) {
		this.children = a
		for (var b = 0, c = 0, d = 0; d < a.length; ++d) {
			var e = a[d],
				b = b + e.chunkSize(),
				c = c + e.height
			e.parent = this
		}
		this.size = b
		this.height = c
		this.parent = null
	}
	function Ga(a, b, c) {
		function d(a, f, g) {
			if (a.linked)
				for (var h = 0; h < a.linked.length; ++h) {
					var k = a.linked[h]
					if (k.doc != f) {
						var l = g && k.sharedHist
						if (!c || l) b(k.doc, l), d(k.doc, a, l)
					}
				}
		}
		d(a, null, !0)
	}
	function Ed(a, b) {
		if (b.cm) throw Error("This document is already in use.")
		a.doc = b
		b.cm = a
		Ac(a)
		zc(a)
		a.options.lineWrapping || Dc(a)
		a.options.mode = b.modeOption
		Q(a)
	}
	function u(a, b) {
		b -= a.first
		if (0 > b || b >= a.size) throw Error("There is no line " + (b + a.first) + " in the document.")
		for (var c = a; !c.lines; )
			for (var d = 0; ; ++d) {
				var e = c.children[d],
					f = e.chunkSize()
				if (b < f) {
					c = e
					break
				}
				b -= f
			}
		return c.lines[b]
	}
	function Da(a, b, c) {
		var d = [],
			e = b.line
		a.iter(b.line, c.line + 1, function (a) {
			a = a.text
			e == c.line && (a = a.slice(0, c.ch))
			e == b.line && (a = a.slice(b.ch))
			d.push(a)
			++e
		})
		return d
	}
	function xd(a, b, c) {
		var d = []
		a.iter(b, c, function (a) {
			d.push(a.text)
		})
		return d
	}
	function ca(a, b) {
		var c = b - a.height
		if (c) for (var d = a; d; d = d.parent) d.height += c
	}
	function F(a) {
		if (null == a.parent) return null
		var b = a.parent
		a = D(b.lines, a)
		for (var c = b.parent; c; b = c, c = c.parent) for (var d = 0; c.children[d] != b; ++d) a += c.children[d].chunkSize()
		return a + b.first
	}
	function Ba(a, b) {
		var c = a.first
		a: do {
			for (var d = 0; d < a.children.length; ++d) {
				var e = a.children[d],
					f = e.height
				if (b < f) {
					a = e
					continue a
				}
				b -= f
				c += e.chunkSize()
			}
			return c
		} while (!a.lines)
		for (d = 0; d < a.lines.length; ++d) {
			e = a.lines[d].height
			if (b < e) break
			b -= e
		}
		return c + d
	}
	function ea(a) {
		a = ia(a)
		for (var b = 0, c = a.parent, d = 0; d < c.lines.length; ++d) {
			var e = c.lines[d]
			if (e == a) break
			else b += e.height
		}
		for (a = c.parent; a; c = a, a = c.parent) for (d = 0; d < a.children.length && ((e = a.children[d]), e != c); ++d) b += e.height
		return b
	}
	function Y(a) {
		var b = a.order
		null == b && (b = a.order = gg(a.text))
		return b
	}
	function uc(a) {
		this.done = []
		this.undone = []
		this.undoDepth = Infinity
		this.lastModTime = this.lastSelTime = 0
		this.lastOrigin = this.lastSelOrigin = this.lastOp = this.lastSelOp = null
		this.generation = this.maxGeneration = a || 1
	}
	function pd(a, b) {
		var c = { from: Rc(b.from), to: ta(b), text: Da(a, b.from, b.to) }
		cf(a, c, b.from.line, b.to.line + 1)
		Ga(
			a,
			function (a) {
				cf(a, c, b.from.line, b.to.line + 1)
			},
			!0
		)
		return c
	}
	function ce(a) {
		for (; a.length; )
			if (A(a).ranges) a.pop()
			else break
	}
	function Ie(a, b, c, d) {
		var e = a.history
		e.undone.length = 0
		var f = +new Date(),
			g,
			h
		if ((h = e.lastOp == d || (e.lastOrigin == b.origin && b.origin && (("+" == b.origin.charAt(0) && a.cm && e.lastModTime > f - a.cm.options.historyEventDelay) || "*" == b.origin.charAt(0))))) e.lastOp == d ? (ce(e.done), (g = A(e.done))) : e.done.length && !A(e.done).ranges ? (g = A(e.done)) : 1 < e.done.length && !e.done[e.done.length - 2].ranges ? (e.done.pop(), (g = A(e.done))) : (g = void 0), (h = g)
		if (h) {
			var k = A(g.changes)
			0 == y(b.from, b.to) && 0 == y(b.from, k.to) ? (k.to = ta(b)) : g.changes.push(pd(a, b))
		} else for (((g = A(e.done)) && g.ranges) || Wb(a.sel, e.done), g = { changes: [pd(a, b)], generation: e.generation }, e.done.push(g); e.done.length > e.undoDepth; ) e.done.shift(), e.done[0].ranges || e.done.shift()
		e.done.push(c)
		e.generation = ++e.maxGeneration
		e.lastModTime = e.lastSelTime = f
		e.lastOp = e.lastSelOp = d
		e.lastOrigin = e.lastSelOrigin = b.origin
		k || K(a, "historyAdded")
	}
	function Wb(a, b) {
		var c = A(b)
		;(c && c.ranges && c.equals(a)) || b.push(a)
	}
	function cf(a, b, c, d) {
		var e = b["spans_" + a.id],
			f = 0
		a.iter(Math.max(a.first, c), Math.min(a.first + a.size, d), function (c) {
			c.markedSpans && ((e || (e = b["spans_" + a.id] = {}))[f] = c.markedSpans)
			++f
		})
	}
	function Zf(a) {
		if (!a) return null
		for (var b = 0, c; b < a.length; ++b) a[b].marker.explicitlyCleared ? c || (c = a.slice(0, b)) : c && c.push(a[b])
		return c ? (c.length ? c : null) : a
	}
	function Xa(a, b, c) {
		for (var d = 0, e = []; d < a.length; ++d) {
			var f = a[d]
			if (f.ranges) e.push(c ? la.prototype.deepCopy.call(f) : f)
			else {
				var f = f.changes,
					g = []
				e.push({ changes: g })
				for (var h = 0; h < f.length; ++h) {
					var k = f[h],
						l
					g.push({ from: k.from, to: k.to, text: k.text })
					if (b) for (var m in k) (l = m.match(/^spans_(\d+)$/)) && -1 < D(b, Number(l[1])) && ((A(g)[m] = k[m]), delete k[m])
				}
			}
		}
		return e
	}
	function df(a, b, c, d) {
		c < a.line ? (a.line += d) : b < a.line && ((a.line = b), (a.ch = 0))
	}
	function ef(a, b, c, d) {
		for (var e = 0; e < a.length; ++e) {
			var f = a[e],
				g = !0
			if (f.ranges) {
				f.copied || ((f = a[e] = f.deepCopy()), (f.copied = !0))
				for (var h = 0; h < f.ranges.length; h++) df(f.ranges[h].anchor, b, c, d), df(f.ranges[h].head, b, c, d)
			} else {
				for (h = 0; h < f.changes.length; ++h) {
					var k = f.changes[h]
					if (c < k.from.line) (k.from = r(k.from.line + d, k.from.ch)), (k.to = r(k.to.line + d, k.to.ch))
					else if (b <= k.to.line) {
						g = !1
						break
					}
				}
				g || (a.splice(0, e + 1), (e = 0))
			}
		}
	}
	function Je(a, b) {
		var c = b.from.line,
			d = b.to.line,
			e = b.text.length - (d - c) - 1
		ef(a.done, c, d, e)
		ef(a.undone, c, d, e)
	}
	function ld(a) {
		return null != a.defaultPrevented ? a.defaultPrevented : 0 == a.returnValue
	}
	function xe(a) {
		var b = a.which
		null == b && (a.button & 1 ? (b = 1) : a.button & 2 ? (b = 3) : a.button & 4 && (b = 2))
		W && a.ctrlKey && 1 == b && (b = 3)
		return b
	}
	function L(a, b) {
		function c(a) {
			return function () {
				a.apply(null, e)
			}
		}
		var d = a._handlers && a._handlers[b]
		if (d) {
			var e = Array.prototype.slice.call(arguments, 2),
				f
			Ta ? (f = Ta.delayedCallbacks) : Db ? (f = Db) : ((f = Db = []), setTimeout(hg, 0))
			for (var g = 0; g < d.length; ++g) f.push(c(d[g]))
		}
	}
	function hg() {
		var a = Db
		Db = null
		for (var b = 0; b < a.length; ++b) a[b]()
	}
	function ja(a, b, c) {
		"string" == typeof b &&
			(b = {
				type: b,
				preventDefault: function () {
					this.defaultPrevented = !0
				}
			})
		K(a, c || b.type, a, b)
		return ld(b) || b.codemirrorIgnore
	}
	function fe(a) {
		var b = a._handlers && a._handlers.cursorActivity
		if (b) {
			a = a.curOp.cursorActivityHandlers || (a.curOp.cursorActivityHandlers = [])
			for (var c = 0; c < b.length; ++c) -1 == D(a, b[c]) && a.push(b[c])
		}
	}
	function S(a, b) {
		var c = a._handlers && a._handlers[b]
		return c && 0 < c.length
	}
	function Ya(a) {
		a.prototype.on = function (a, c) {
			v(this, a, c)
		}
		a.prototype.off = function (a, c) {
			ka(this, a, c)
		}
	}
	function bb() {
		this.id = null
	}
	function ye(a, b, c) {
		for (var d = 0, e = 0; ; ) {
			var f = a.indexOf("\t", d)
			;-1 == f && (f = a.length)
			var g = f - d
			if (f == a.length || e + g >= b) return d + Math.min(g, b - e)
			e += f - d
			e += c - (e % c)
			d = f + 1
			if (e >= b) return d
		}
	}
	function Ne(a) {
		for (; vc.length <= a; ) vc.push(A(vc) + " ")
		return vc[a]
	}
	function A(a) {
		return a[a.length - 1]
	}
	function D(a, b) {
		for (var c = 0; c < a.length; ++c) if (a[c] == b) return c
		return -1
	}
	function ob(a, b) {
		for (var c = [], d = 0; d < a.length; d++) c[d] = b(a[d], d)
		return c
	}
	function Eb() {}
	function ff(a, b) {
		var c
		Object.create ? (c = Object.create(a)) : ((Eb.prototype = a), (c = new Eb()))
		b && V(b, c)
		return c
	}
	function V(a, b, c) {
		b || (b = {})
		for (var d in a) !a.hasOwnProperty(d) || (!1 === c && b.hasOwnProperty(d)) || (b[d] = a[d])
		return b
	}
	function cb(a) {
		var b = Array.prototype.slice.call(arguments, 1)
		return function () {
			return a.apply(null, b)
		}
	}
	function oc(a, b) {
		return b ? (-1 < b.source.indexOf("\\w") && gf(a) ? !0 : b.test(a)) : gf(a)
	}
	function hf(a) {
		for (var b in a) if (a.hasOwnProperty(b) && a[b]) return !1
		return !0
	}
	function tb(a) {
		return 768 <= a.charCodeAt(0) && ig.test(a)
	}
	function t(a, b, c, d) {
		a = document.createElement(a)
		c && (a.className = c)
		d && (a.style.cssText = d)
		if ("string" == typeof b) a.appendChild(document.createTextNode(b))
		else if (b) for (c = 0; c < b.length; ++c) a.appendChild(b[c])
		return a
	}
	function za(a) {
		for (var b = a.childNodes.length; 0 < b; --b) a.removeChild(a.firstChild)
		return a
	}
	function U(a, b) {
		return za(a).appendChild(b)
	}
	function fa() {
		return document.activeElement
	}
	function Fb(a) {
		return new RegExp("(^|\\s)" + a + "(?:$|\\s)\\s*")
	}
	function wd(a, b) {
		for (var c = a.split(" "), d = 0; d < c.length; d++) c[d] && !Fb(c[d]).test(b) && (b += " " + c[d])
		return b
	}
	function jf(a) {
		if (document.body.getElementsByClassName)
			for (var b = document.body.getElementsByClassName("CodeMirror"), c = 0; c < b.length; c++) {
				var d = b[c].CodeMirror
				d && a(d)
			}
	}
	function tf() {
		var a
		v(window, "resize", function () {
			null == a &&
				(a = setTimeout(function () {
					a = null
					jf(If)
				}, 100))
		})
		v(window, "blur", function () {
			jf(db)
		})
	}
	function eg(a) {
		if (null == yd) {
			var b = t("span", "​")
			U(a, t("span", [b, document.createTextNode("x")]))
			0 != a.firstChild.offsetHeight && (yd = 1 >= b.offsetWidth && 2 < b.offsetHeight && !(B && 8 > C))
		}
		a = yd ? t("span", "​") : t("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px")
		a.setAttribute("cm-text", "")
		return a
	}
	function Af(a, b, c, d) {
		if (!a) return d(b, c, "ltr")
		for (var e = !1, f = 0; f < a.length; ++f) {
			var g = a[f]
			if ((g.from < c && g.to > b) || (b == c && g.to == b)) d(Math.max(g.from, b), Math.min(g.to, c), 1 == g.level ? "rtl" : "ltr"), (e = !0)
		}
		e || d(b, c, "ltr")
	}
	function dd(a) {
		return a.level % 2 ? a.to : a.from
	}
	function ed(a) {
		return a.level % 2 ? a.from : a.to
	}
	function ac(a) {
		return (a = Y(a)) ? dd(a[0]) : 0
	}
	function bc(a) {
		var b = Y(a)
		return b ? ed(A(b)) : a.text.length
	}
	function kf(a, b) {
		var c = u(a.doc, b),
			d = ia(c)
		d != c && (b = F(d))
		d = (c = Y(d)) ? (c[0].level % 2 ? bc(d) : ac(d)) : 0
		return r(b, d)
	}
	function lf(a, b) {
		var c = kf(a, b.line),
			d = u(a.doc, c.line),
			e = Y(d)
		return e && 0 != e[0].level ? c : ((d = Math.max(0, d.text.search(/\S/))), r(c.line, b.line == c.line && b.ch <= d && b.ch ? 0 : d))
	}
	function Sb(a, b) {
		vb = null
		for (var c = 0, d; c < a.length; ++c) {
			var e = a[c]
			if (e.from < b && e.to > b) return c
			if (e.from == b || e.to == b)
				if (null == d) d = c
				else {
					var f
					f = e.level
					var g = a[d].level,
						h = a[0].level
					f = f == h ? !0 : g == h ? !1 : f < g
					if (f) return e.from != e.to && (vb = d), c
					e.from != e.to && (vb = c)
					break
				}
		}
		return d
	}
	function zd(a, b, c, d) {
		if (!d) return b + c
		do b += c
		while (0 < b && tb(a.text.charAt(b)))
		return b
	}
	function gd(a, b, c, d) {
		var e = Y(a)
		if (!e) return Oe(a, b, c, d)
		var f = Sb(e, b),
			g = e[f]
		for (b = zd(a, b, g.level % 2 ? -c : c, d); ; ) {
			if (b > g.from && b < g.to) return b
			if (b == g.from || b == g.to) {
				if (Sb(e, b) == f) return b
				g = e[f + c]
				return 0 < c == g.level % 2 ? g.to : g.from
			}
			g = e[(f += c)]
			if (!g) return null
			b = 0 < c == g.level % 2 ? zd(a, g.to, -1, d) : zd(a, g.from, 1, d)
		}
	}
	function Oe(a, b, c, d) {
		b += c
		if (d) for (; 0 < b && tb(a.text.charAt(b)); ) b += c
		return 0 > b || b > a.text.length ? null : b
	}
	var wa = /gecko\/\d/i.test(navigator.userAgent),
		mf = /MSIE \d/.test(navigator.userAgent),
		nf = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),
		B = mf || nf,
		C = B && (mf ? document.documentMode || 6 : nf[1]),
		J = /WebKit\//.test(navigator.userAgent),
		jg = J && /Qt\/\d+\.\d+/.test(navigator.userAgent),
		kg = /Chrome\//.test(navigator.userAgent),
		ba = /Opera\//.test(navigator.userAgent),
		te = /Apple Computer/.test(navigator.vendor),
		lg = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
		Gf = /PhantomJS/.test(navigator.userAgent),
		Qa = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent),
		ab = Qa || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),
		W = Qa || /Mac/.test(navigator.platform),
		mg = /win/i.test(navigator.platform),
		Ia = ba && navigator.userAgent.match(/Version\/(\d*\.\d*)/)
	Ia && (Ia = Number(Ia[1]))
	Ia && 15 <= Ia && ((ba = !1), (J = !0))
	var of = W && (jg || (ba && (null == Ia || 12.11 > Ia))),
		id = wa || (B && 9 <= C),
		Ge = !1,
		ra = !1
	Fc.prototype = V(
		{
			update: function (a) {
				var b = a.scrollWidth > a.clientWidth + 1,
					c = a.scrollHeight > a.clientHeight + 1,
					d = a.nativeBarWidth
				c ? ((this.vert.style.display = "block"), (this.vert.style.bottom = b ? d + "px" : "0"), (this.vert.firstChild.style.height = Math.max(0, a.scrollHeight - a.clientHeight + (a.viewHeight - (b ? d : 0))) + "px")) : ((this.vert.style.display = ""), (this.vert.firstChild.style.height = "0"))
				b ? ((this.horiz.style.display = "block"), (this.horiz.style.right = c ? d + "px" : "0"), (this.horiz.style.left = a.barLeft + "px"), (this.horiz.firstChild.style.width = a.scrollWidth - a.clientWidth + (a.viewWidth - a.barLeft - (c ? d : 0)) + "px")) : ((this.horiz.style.display = ""), (this.horiz.firstChild.style.width = "0"))
				!this.checkedOverlay && 0 < a.clientHeight && (0 == d && this.overlayHack(), (this.checkedOverlay = !0))
				return { right: c ? d : 0, bottom: b ? d : 0 }
			},
			setScrollLeft: function (a) {
				this.horiz.scrollLeft != a && (this.horiz.scrollLeft = a)
			},
			setScrollTop: function (a) {
				this.vert.scrollTop != a && (this.vert.scrollTop = a)
			},
			overlayHack: function () {
				this.horiz.style.minHeight = this.vert.style.minWidth = W && !lg ? "12px" : "18px"
				var a = this,
					b = function (b) {
						;(b.target || b.srcElement) != a.vert && (b.target || b.srcElement) != a.horiz && G(a.cm, pe)(b)
					}
				v(this.vert, "mousedown", b)
				v(this.horiz, "mousedown", b)
			},
			clear: function () {
				var a = this.horiz.parentNode
				a.removeChild(this.horiz)
				a.removeChild(this.vert)
			}
		},
		Fc.prototype
	)
	Gc.prototype = V(
		{
			update: function () {
				return { bottom: 0, right: 0 }
			},
			setScrollLeft: function () {},
			setScrollTop: function () {},
			clear: function () {}
		},
		Gc.prototype
	)
	q.scrollbarModel = { native: Fc, null: Gc }
	Mb.prototype.signal = function (a, b) {
		S(a, b) && this.events.push(arguments)
	}
	Mb.prototype.finish = function () {
		for (var a = 0; a < this.events.length; a++) K.apply(null, this.events[a])
	}
	var r = (q.Pos = function (a, b) {
			if (!(this instanceof r)) return new r(a, b)
			this.line = a
			this.ch = b
		}),
		y = (q.cmpPos = function (a, b) {
			return a.line - b.line || a.ch - b.ch
		}),
		X = null
	Tc.prototype = V(
		{
			init: function (a) {
				function b(a) {
					if (d.somethingSelected()) (X = d.getSelections()), c.inaccurateSelection && ((c.prevInput = ""), (c.inaccurateSelection = !1), (f.value = X.join("\n")), Za(f))
					else if (d.options.lineWiseCopyCut) {
						var b = Vd(d)
						X = b.text
						"cut" == a.type ? d.setSelections(b.ranges, null, ha) : ((c.prevInput = ""), (f.value = b.text.join("\n")), Za(f))
					} else return
					"cut" == a.type && (d.state.cutIncoming = !0)
				}
				var c = this,
					d = this.cm,
					e = (this.wrapper = Xd()),
					f = (this.textarea = e.firstChild)
				a.wrapper.insertBefore(e, a.wrapper.firstChild)
				Qa && (f.style.width = "0px")
				v(f, "input", function () {
					B && 9 <= C && c.hasSelection && (c.hasSelection = null)
					c.poll()
				})
				v(f, "paste", function () {
					if (J && !d.state.fakedLastChar && !(200 > new Date() - d.state.lastMiddleDown)) {
						var a = f.selectionStart,
							b = f.selectionEnd
						f.value += "$"
						f.selectionEnd = b
						f.selectionStart = a
						d.state.fakedLastChar = !0
					}
					d.state.pasteIncoming = !0
					c.fastPoll()
				})
				v(f, "cut", b)
				v(f, "copy", b)
				v(a.scroller, "paste", function (b) {
					oa(a, b) || ((d.state.pasteIncoming = !0), c.focus())
				})
				v(a.lineSpace, "selectstart", function (b) {
					oa(a, b) || O(b)
				})
				v(f, "compositionstart", function () {
					var a = d.getCursor("from")
					c.composing = { start: a, range: d.markText(a, d.getCursor("to"), { className: "CodeMirror-composing" }) }
				})
				v(f, "compositionend", function () {
					c.composing && (c.poll(), c.composing.range.clear(), (c.composing = null))
				})
			},
			prepareSelection: function () {
				var a = this.cm,
					b = a.display,
					c = a.doc,
					d = he(a)
				if (a.options.moveInputWithCursor) {
					var a = ma(a, c.sel.primary().head, "div"),
						c = b.wrapper.getBoundingClientRect(),
						e = b.lineDiv.getBoundingClientRect()
					d.teTop = Math.max(0, Math.min(b.wrapper.clientHeight - 10, a.top + e.top - c.top))
					d.teLeft = Math.max(0, Math.min(b.wrapper.clientWidth - 10, a.left + e.left - c.left))
				}
				return d
			},
			showSelection: function (a) {
				var b = this.cm.display
				U(b.cursorDiv, a.cursors)
				U(b.selectionDiv, a.selection)
				null != a.teTop && ((this.wrapper.style.top = a.teTop + "px"), (this.wrapper.style.left = a.teLeft + "px"))
			},
			reset: function (a) {
				if (!this.contextMenuPending) {
					var b,
						c,
						d = this.cm,
						e = d.doc
					d.somethingSelected() ? ((this.prevInput = ""), (b = e.sel.primary()), (c = (b = Ce && (100 < b.to().line - b.from().line || 1e3 < (c = d.getSelection()).length)) ? "-" : c || d.getSelection()), (this.textarea.value = c), d.state.focused && Za(this.textarea), B && 9 <= C && (this.hasSelection = c)) : a || ((this.prevInput = this.textarea.value = ""), B && 9 <= C && (this.hasSelection = null))
					this.inaccurateSelection = b
				}
			},
			getField: function () {
				return this.textarea
			},
			supportsTouch: function () {
				return !1
			},
			focus: function () {
				if ("nocursor" != this.cm.options.readOnly && (!ab || fa() != this.textarea))
					try {
						this.textarea.focus()
					} catch (a) {}
			},
			blur: function () {
				this.textarea.blur()
			},
			resetPosition: function () {
				this.wrapper.style.top = this.wrapper.style.left = 0
			},
			receivedFocus: function () {
				this.slowPoll()
			},
			slowPoll: function () {
				var a = this
				a.pollingFast ||
					a.polling.set(this.cm.options.pollInterval, function () {
						a.poll()
						a.cm.state.focused && a.slowPoll()
					})
			},
			fastPoll: function () {
				function a() {
					c.poll() || b ? ((c.pollingFast = !1), c.slowPoll()) : ((b = !0), c.polling.set(60, a))
				}
				var b = !1,
					c = this
				c.pollingFast = !0
				c.polling.set(20, a)
			},
			poll: function () {
				var a = this.cm,
					b = this.textarea,
					c = this.prevInput
				if (!a.state.focused || (ng(b) && !c) || Rb(a) || a.options.disableInput || a.state.keySeq) return !1
				a.state.pasteIncoming && a.state.fakedLastChar && ((b.value = b.value.substring(0, b.value.length - 1)), (a.state.fakedLastChar = !1))
				var d = b.value
				if (d == c && !a.somethingSelected()) return !1
				if ((B && 9 <= C && this.hasSelection === d) || (W && /[\uf700-\uf7ff]/.test(d))) return a.display.input.reset(), !1
				if (a.doc.sel == a.display.selForContextMenu) {
					var e = d.charCodeAt(0)
					8203 != e || c || (c = "​")
					if (8666 == e) return this.reset(), this.cm.execCommand("undo")
				}
				for (var f = 0, e = Math.min(c.length, d.length); f < e && c.charCodeAt(f) == d.charCodeAt(f); ) ++f
				var g = this
				T(a, function () {
					Sc(a, d.slice(f), c.length - f, null, g.composing ? "*compose" : null)
					1e3 < d.length || -1 < d.indexOf("\n") ? (b.value = g.prevInput = "") : (g.prevInput = d)
					g.composing && (g.composing.range.clear(), (g.composing.range = a.markText(g.composing.start, a.getCursor("to"), { className: "CodeMirror-composing" })))
				})
				return !0
			},
			ensurePolled: function () {
				this.pollingFast && this.poll() && (this.pollingFast = !1)
			},
			onKeyPress: function () {
				B && 9 <= C && (this.hasSelection = null)
				this.fastPoll()
			},
			onContextMenu: function (a) {
				function b() {
					if (null != g.selectionStart) {
						var a = e.somethingSelected(),
							b = "​" + (a ? g.value : "")
						g.value = "⇚"
						g.value = b
						d.prevInput = a ? "" : "​"
						g.selectionStart = 1
						g.selectionEnd = b.length
						f.selForContextMenu = e.doc.sel
					}
				}
				function c() {
					d.contextMenuPending = !1
					d.wrapper.style.position = "relative"
					g.style.cssText = l
					B && 9 > C && f.scrollbars.setScrollTop((f.scroller.scrollTop = k))
					if (null != g.selectionStart) {
						;(!B || (B && 9 > C)) && b()
						var a = 0,
							c = function () {
								f.selForContextMenu == e.doc.sel && 0 == g.selectionStart && 0 < g.selectionEnd && "​" == d.prevInput ? G(e, ic.selectAll)(e) : 10 > a++ ? (f.detectingSelectAll = setTimeout(c, 500)) : f.input.reset()
							}
						f.detectingSelectAll = setTimeout(c, 200)
					}
				}
				var d = this,
					e = d.cm,
					f = e.display,
					g = d.textarea,
					h = Ua(e, a),
					k = f.scroller.scrollTop
				if (h && !ba) {
					e.options.resetSelectionOnContextMenu && -1 == e.doc.sel.contains(h) && G(e, H)(e.doc, ga(h), ha)
					var l = g.style.cssText
					d.wrapper.style.position = "absolute"
					g.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (a.clientY - 5) + "px; left: " + (a.clientX - 5) + "px; z-index: 1000; background: " + (B ? "rgba(255, 255, 255, .05)" : "transparent") + "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity\x3d5);"
					if (J) var m = window.scrollY
					f.input.focus()
					J && window.scrollTo(null, m)
					f.input.reset()
					e.somethingSelected() || (g.value = d.prevInput = " ")
					d.contextMenuPending = !0
					f.selForContextMenu = e.doc.sel
					clearTimeout(f.detectingSelectAll)
					B && 9 <= C && b()
					if (id) {
						jd(a)
						var p = function () {
							ka(window, "mouseup", p)
							setTimeout(c, 20)
						}
						v(window, "mouseup", p)
					} else setTimeout(c, 50)
				}
			},
			setUneditable: Eb,
			needsContentAttribute: !1
		},
		Tc.prototype
	)
	Uc.prototype = V(
		{
			init: function (a) {
				function b(a) {
					if (d.somethingSelected()) (X = d.getSelections()), "cut" == a.type && d.replaceSelection("", null, "cut")
					else if (d.options.lineWiseCopyCut) {
						var b = Vd(d)
						X = b.text
						"cut" == a.type &&
							d.operation(function () {
								d.setSelections(b.ranges, 0, ha)
								d.replaceSelection("", null, "cut")
							})
					} else return
					if (a.clipboardData && !Qa) a.preventDefault(), a.clipboardData.clearData(), a.clipboardData.setData("text/plain", X.join("\n"))
					else {
						var c = Xd()
						a = c.firstChild
						d.display.lineSpace.insertBefore(c, d.display.lineSpace.firstChild)
						a.value = X.join("\n")
						var h = document.activeElement
						Za(a)
						setTimeout(function () {
							d.display.lineSpace.removeChild(c)
							h.focus()
						}, 50)
					}
				}
				var c = this,
					d = c.cm
				a = c.div = a.lineDiv
				a.contentEditable = "true"
				Wd(a)
				v(a, "paste", function (a) {
					var b = a.clipboardData && a.clipboardData.getData("text/plain")
					b && (a.preventDefault(), d.replaceSelection(b, null, "paste"))
				})
				v(a, "compositionstart", function (a) {
					a = a.data
					c.composing = { sel: d.doc.sel, data: a, startData: a }
					if (a) {
						var b = d.doc.sel.primary(),
							g = d.getLine(b.head.line).indexOf(a, Math.max(0, b.head.ch - a.length))
						;-1 < g && g <= b.head.ch && (c.composing.sel = ga(r(b.head.line, g), r(b.head.line, g + a.length)))
					}
				})
				v(a, "compositionupdate", function (a) {
					c.composing.data = a.data
				})
				v(a, "compositionend", function (a) {
					var b = c.composing
					b &&
						(a.data == b.startData || /\u200b/.test(a.data) || (b.data = a.data),
						setTimeout(function () {
							b.handled || c.applyComposition(b)
							c.composing == b && (c.composing = null)
						}, 50))
				})
				v(a, "touchstart", function () {
					c.forceCompositionEnd()
				})
				v(a, "input", function () {
					c.composing ||
						c.pollContent() ||
						T(c.cm, function () {
							Q(d)
						})
				})
				v(a, "copy", b)
				v(a, "cut", b)
			},
			prepareSelection: function () {
				var a = he(this.cm, !1)
				a.focus = this.cm.state.focused
				return a
			},
			showSelection: function (a) {
				a && this.cm.display.view.length && (a.focus && this.showPrimarySelection(), this.showMultipleSelections(a))
			},
			showPrimarySelection: function () {
				var a = window.getSelection(),
					b = this.cm.doc.sel.primary(),
					c = Tb(this.cm, a.anchorNode, a.anchorOffset),
					d = Tb(this.cm, a.focusNode, a.focusOffset)
				if (!c || c.bad || !d || d.bad || 0 != y(Qb(c, d), b.from()) || 0 != y(Pb(c, d), b.to()))
					if (((c = Yd(this.cm, b.from())), (d = Yd(this.cm, b.to())), c || d)) {
						var e = this.cm.display.view,
							b = a.rangeCount && a.getRangeAt(0)
						c ? d || ((d = e[e.length - 1].measure), (d = d.maps ? d.maps[d.maps.length - 1] : d.map), (d = { node: d[d.length - 1], offset: d[d.length - 2] - d[d.length - 3] })) : (c = { node: e[0].measure.map[2], offset: 0 })
						try {
							var f = Ea(c.node, c.offset, d.offset, d.node)
						} catch (g) {}
						f && (a.removeAllRanges(), a.addRange(f), b && null == a.anchorNode ? a.addRange(b) : wa && this.startGracePeriod())
						this.rememberSelection()
					}
			},
			startGracePeriod: function () {
				var a = this
				clearTimeout(this.gracePeriod)
				this.gracePeriod = setTimeout(function () {
					a.gracePeriod = !1
					a.selectionChanged() &&
						a.cm.operation(function () {
							a.cm.curOp.selectionChanged = !0
						})
				}, 20)
			},
			showMultipleSelections: function (a) {
				U(this.cm.display.cursorDiv, a.cursors)
				U(this.cm.display.selectionDiv, a.selection)
			},
			rememberSelection: function () {
				var a = window.getSelection()
				this.lastAnchorNode = a.anchorNode
				this.lastAnchorOffset = a.anchorOffset
				this.lastFocusNode = a.focusNode
				this.lastFocusOffset = a.focusOffset
			},
			selectionInEditor: function () {
				var a = window.getSelection()
				if (!a.rangeCount) return !1
				a = a.getRangeAt(0).commonAncestorContainer
				return Wc(this.div, a)
			},
			focus: function () {
				"nocursor" != this.cm.options.readOnly && this.div.focus()
			},
			blur: function () {
				this.div.blur()
			},
			getField: function () {
				return this.div
			},
			supportsTouch: function () {
				return !0
			},
			receivedFocus: function () {
				function a() {
					b.cm.state.focused && (b.pollSelection(), b.polling.set(b.cm.options.pollInterval, a))
				}
				var b = this
				this.selectionInEditor()
					? this.pollSelection()
					: T(this.cm, function () {
							b.cm.curOp.selectionChanged = !0
					  })
				this.polling.set(this.cm.options.pollInterval, a)
			},
			selectionChanged: function () {
				var a = window.getSelection()
				return a.anchorNode != this.lastAnchorNode || a.anchorOffset != this.lastAnchorOffset || a.focusNode != this.lastFocusNode || a.focusOffset != this.lastFocusOffset
			},
			pollSelection: function () {
				if (!this.composing && !this.gracePeriod && this.selectionChanged()) {
					var a = window.getSelection(),
						b = this.cm
					this.rememberSelection()
					var c = Tb(b, a.anchorNode, a.anchorOffset),
						d = Tb(b, a.focusNode, a.focusOffset)
					c &&
						d &&
						T(b, function () {
							H(b.doc, ga(c, d), ha)
							if (c.bad || d.bad) b.curOp.selectionChanged = !0
						})
				}
			},
			pollContent: function () {
				var a = this.cm,
					b = a.display,
					c = a.doc.sel.primary(),
					d = c.from(),
					c = c.to()
				if (d.line < b.viewFrom || c.line > b.viewTo - 1) return !1
				var e
				d.line == b.viewFrom || 0 == (e = Ca(a, d.line)) ? ((d = F(b.view[0].line)), (e = b.view[0].node)) : ((d = F(b.view[e].line)), (e = b.view[e - 1].node.nextSibling))
				var f = Ca(a, c.line)
				f == b.view.length - 1 ? ((c = b.viewTo - 1), (b = b.view[f].node)) : ((c = F(b.view[f + 1].line) - 1), (b = b.view[f + 1].node.previousSibling))
				b = sa(xf(a, e, b, d, c))
				for (e = Da(a.doc, r(d, 0), r(c, u(a.doc, c).text.length)); 1 < b.length && 1 < e.length; )
					if (A(b) == A(e)) b.pop(), e.pop(), c--
					else if (b[0] == e[0]) b.shift(), e.shift(), d++
					else break
				for (var g = 0, f = 0, h = b[0], k = e[0], l = Math.min(h.length, k.length); g < l && h.charCodeAt(g) == k.charCodeAt(g); ) ++g
				h = A(b)
				k = A(e)
				for (l = Math.min(h.length - (1 == b.length ? g : 0), k.length - (1 == e.length ? g : 0)); f < l && h.charCodeAt(h.length - f - 1) == k.charCodeAt(k.length - f - 1); ) ++f
				b[b.length - 1] = h.slice(0, h.length - f)
				b[0] = b[0].slice(g)
				d = r(d, g)
				c = r(c, e.length ? A(e).length - f : 0)
				if (1 < b.length || b[0] || y(d, c)) return wb(a.doc, b, d, c, "+input"), !0
			},
			ensurePolled: function () {
				this.forceCompositionEnd()
			},
			reset: function () {
				this.forceCompositionEnd()
			},
			forceCompositionEnd: function () {
				this.composing && !this.composing.handled && (this.applyComposition(this.composing), (this.composing.handled = !0), this.div.blur(), this.div.focus())
			},
			applyComposition: function (a) {
				a.data && a.data != a.startData && G(this.cm, Sc)(this.cm, a.data, 0, a.sel)
			},
			setUneditable: function (a) {
				a.setAttribute("contenteditable", "false")
			},
			onKeyPress: function (a) {
				a.preventDefault()
				G(this.cm, Sc)(this.cm, String.fromCharCode(null == a.charCode ? a.keyCode : a.charCode), 0)
			},
			onContextMenu: Eb,
			resetPosition: Eb,
			needsContentAttribute: !0
		},
		Uc.prototype
	)
	q.inputStyles = { textarea: Tc, contenteditable: Uc }
	la.prototype = {
		primary: function () {
			return this.ranges[this.primIndex]
		},
		equals: function (a) {
			if (a == this) return !0
			if (a.primIndex != this.primIndex || a.ranges.length != this.ranges.length) return !1
			for (var b = 0; b < this.ranges.length; b++) {
				var c = this.ranges[b],
					d = a.ranges[b]
				if (0 != y(c.anchor, d.anchor) || 0 != y(c.head, d.head)) return !1
			}
			return !0
		},
		deepCopy: function () {
			for (var a = [], b = 0; b < this.ranges.length; b++) a[b] = new z(Rc(this.ranges[b].anchor), Rc(this.ranges[b].head))
			return new la(a, this.primIndex)
		},
		somethingSelected: function () {
			for (var a = 0; a < this.ranges.length; a++) if (!this.ranges[a].empty()) return !0
			return !1
		},
		contains: function (a, b) {
			b || (b = a)
			for (var c = 0; c < this.ranges.length; c++) {
				var d = this.ranges[c]
				if (0 <= y(b, d.from()) && 0 >= y(a, d.to())) return c
			}
			return -1
		}
	}
	z.prototype = {
		from: function () {
			return Qb(this.anchor, this.head)
		},
		to: function () {
			return Pb(this.anchor, this.head)
		},
		empty: function () {
			return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch
		}
	}
	var ad = { left: 0, right: 0, top: 0, bottom: 0 },
		Fa,
		Ta = null,
		Ff = 0,
		fc,
		ec,
		se = 0,
		gc = 0,
		R = null
	B ? (R = -0.53) : wa ? (R = 15) : kg ? (R = -0.7) : te && (R = -1 / 3)
	var ze = function (a) {
		var b = a.wheelDeltaX,
			c = a.wheelDeltaY
		null == b && a.detail && a.axis == a.HORIZONTAL_AXIS && (b = a.detail)
		null == c && a.detail && a.axis == a.VERTICAL_AXIS ? (c = a.detail) : null == c && (c = a.wheelDelta)
		return { x: b, y: c }
	}
	q.wheelEventPixels = function (a) {
		a = ze(a)
		a.x *= R
		a.y *= R
		return a
	}
	var Qf = new bb(),
		md = null,
		ta = (q.changeEnd = function (a) {
			return a.text ? r(a.from.line + a.text.length - 1, A(a.text).length + (1 == a.text.length ? a.from.ch : 0)) : a.to
		})
	q.prototype = {
		constructor: q,
		focus: function () {
			window.focus()
			this.display.input.focus()
		},
		setOption: function (a, b) {
			var c = this.options,
				d = c[a]
			if (c[a] != b || "mode" == a) (c[a] = b), Ka.hasOwnProperty(a) && G(this, Ka[a])(this, b, d)
		},
		getOption: function (a) {
			return this.options[a]
		},
		getDoc: function () {
			return this.doc
		},
		addKeyMap: function (a, b) {
			this.state.keyMaps[b ? "push" : "unshift"](pc(a))
		},
		removeKeyMap: function (a) {
			for (var b = this.state.keyMaps, c = 0; c < b.length; ++c) if (b[c] == a || b[c].name == a) return b.splice(c, 1), !0
		},
		addOverlay: M(function (a, b) {
			var c = a.token ? a : q.getMode(this.options, a)
			if (c.startState) throw Error("Overlays may not be stateful.")
			this.state.overlays.push({ mode: c, modeSpec: a, opaque: b && b.opaque })
			this.state.modeGen++
			Q(this)
		}),
		removeOverlay: M(function (a) {
			for (var b = this.state.overlays, c = 0; c < b.length; ++c) {
				var d = b[c].modeSpec
				if (d == a || ("string" == typeof a && d.name == a)) {
					b.splice(c, 1)
					this.state.modeGen++
					Q(this)
					break
				}
			}
		}),
		indentLine: M(function (a, b, c) {
			"string" != typeof b && "number" != typeof b && (b = null == b ? (this.options.smartIndent ? "smart" : "prev") : b ? "add" : "subtract")
			qb(this.doc, a) && pb(this, a, b, c)
		}),
		indentSelection: M(function (a) {
			for (var b = this.doc.sel.ranges, c = -1, d = 0; d < b.length; d++) {
				var e = b[d]
				if (e.empty()) e.head.line > c && (pb(this, e.head.line, a, !0), (c = e.head.line), d == this.doc.sel.primIndex && Pa(this))
				else {
					for (var f = e.from(), e = e.to(), g = Math.max(c, f.line), c = Math.min(this.lastLine(), e.line - (e.ch ? 0 : 1)) + 1, e = g; e < c; ++e) pb(this, e, a)
					e = this.doc.sel.ranges
					0 == f.ch && b.length == e.length && 0 < e[d].from().ch && Xc(this.doc, d, new z(f, e[d].to()), ha)
				}
			}
		}),
		getTokenAt: function (a, b) {
			return Ye(this, a, b)
		},
		getLineTokens: function (a, b) {
			return Ye(this, r(a), b, !0)
		},
		getTokenTypeAt: function (a) {
			a = w(this.doc, a)
			var b = $e(this, u(this.doc, a.line)),
				c = 0,
				d = (b.length - 1) / 2
			a = a.ch
			if (0 == a) b = b[2]
			else
				for (;;) {
					var e = (c + d) >> 1
					if ((e ? b[2 * e - 1] : 0) >= a) d = e
					else if (b[2 * e + 1] < a) c = e + 1
					else {
						b = b[2 * e + 2]
						break
					}
				}
			c = b ? b.indexOf("cm-overlay ") : -1
			return 0 > c ? b : 0 == c ? null : b.slice(0, c - 1)
		},
		getModeAt: function (a) {
			var b = this.doc.mode
			return b.innerMode ? q.innerMode(b, this.getTokenAt(a).state).mode : b
		},
		getHelper: function (a, b) {
			return this.getHelpers(a, b)[0]
		},
		getHelpers: function (a, b) {
			var c = []
			if (!$a.hasOwnProperty(b)) return c
			var d = $a[b],
				e = this.getModeAt(a)
			if ("string" == typeof e[b]) d[e[b]] && c.push(d[e[b]])
			else if (e[b])
				for (var f = 0; f < e[b].length; f++) {
					var g = d[e[b][f]]
					g && c.push(g)
				}
			else e.helperType && d[e.helperType] ? c.push(d[e.helperType]) : d[e.name] && c.push(d[e.name])
			for (f = 0; f < d._global.length; f++) (g = d._global[f]), g.pred(e, this) && -1 == D(c, g.val) && c.push(g.val)
			return c
		},
		getStateAfter: function (a, b) {
			var c = this.doc
			a = Math.max(c.first, Math.min(null == a ? c.first + c.size - 1 : a, c.first + c.size - 1))
			return sb(this, a + 1, b)
		},
		cursorCoords: function (a, b) {
			var c
			c = this.doc.sel.primary()
			c = null == a ? c.head : "object" == typeof a ? w(this.doc, a) : a ? c.from() : c.to()
			return ma(this, c, b || "page")
		},
		charCoords: function (a, b) {
			return Yb(this, w(this.doc, a), b || "page")
		},
		coordsChar: function (a, b) {
			a = ne(this, a, b || "page")
			return fd(this, a.left, a.top)
		},
		lineAtHeight: function (a, b) {
			a = ne(this, { top: a, left: 0 }, b || "page").top
			return Ba(this.doc, a + this.display.viewOffset)
		},
		heightAtLine: function (a, b) {
			var c = !1,
				d
			"number" == typeof a ? ((d = this.doc.first + this.doc.size - 1), a < this.doc.first ? (a = this.doc.first) : a > d && ((a = d), (c = !0)), (d = u(this.doc, a))) : (d = a)
			return cd(this, d, { top: 0, left: 0 }, b || "page").top + (c ? this.doc.height - ea(d) : 0)
		},
		defaultTextHeight: function () {
			return xa(this.display)
		},
		defaultCharWidth: function () {
			return gb(this.display)
		},
		setGutterMarker: M(function (a, b, c) {
			return nc(this.doc, a, "gutter", function (a) {
				var e = a.gutterMarkers || (a.gutterMarkers = {})
				e[b] = c
				!c && hf(e) && (a.gutterMarkers = null)
				return !0
			})
		}),
		clearGutter: M(function (a) {
			var b = this,
				c = b.doc,
				d = c.first
			c.iter(function (c) {
				c.gutterMarkers && c.gutterMarkers[a] && ((c.gutterMarkers[a] = null), na(b, d, "gutter"), hf(c.gutterMarkers) && (c.gutterMarkers = null))
				++d
			})
		}),
		lineInfo: function (a) {
			if ("number" == typeof a) {
				if (!qb(this.doc, a)) return null
				var b = a
				a = u(this.doc, a)
				if (!a) return null
			} else if (((b = F(a)), null == b)) return null
			return { line: b, handle: a, text: a.text, gutterMarkers: a.gutterMarkers, textClass: a.textClass, bgClass: a.bgClass, wrapClass: a.wrapClass, widgets: a.widgets }
		},
		getViewport: function () {
			return { from: this.display.viewFrom, to: this.display.viewTo }
		},
		addWidget: function (a, b, c, d, e) {
			var f = this.display
			a = ma(this, w(this.doc, a))
			var g = a.bottom,
				h = a.left
			b.style.position = "absolute"
			b.setAttribute("cm-ignore-events", "true")
			this.display.input.setUneditable(b)
			f.sizer.appendChild(b)
			if ("over" == d) g = a.top
			else if ("above" == d || "near" == d) {
				var k = Math.max(f.wrapper.clientHeight, this.doc.height),
					l = Math.max(f.sizer.clientWidth, f.lineSpace.clientWidth)
				;("above" == d || a.bottom + b.offsetHeight > k) && a.top > b.offsetHeight ? (g = a.top - b.offsetHeight) : a.bottom + b.offsetHeight <= k && (g = a.bottom)
				h + b.offsetWidth > l && (h = l - b.offsetWidth)
			}
			b.style.top = g + "px"
			b.style.left = b.style.right = ""
			"right" == e ? ((h = f.sizer.clientWidth - b.offsetWidth), (b.style.right = "0px")) : ("left" == e ? (h = 0) : "middle" == e && (h = (f.sizer.clientWidth - b.offsetWidth) / 2), (b.style.left = h + "px"))
			c && ((a = cc(this, h, g, h + b.offsetWidth, g + b.offsetHeight)), null != a.scrollTop && lb(this, a.scrollTop), null != a.scrollLeft && Ma(this, a.scrollLeft))
		},
		triggerOnKeyDown: M(ve),
		triggerOnKeyPress: M(we),
		triggerOnKeyUp: ue,
		execCommand: function (a) {
			if (ic.hasOwnProperty(a)) return ic[a](this)
		},
		findPosH: function (a, b, c, d) {
			var e = 1
			0 > b && ((e = -1), (b = -b))
			var f = 0
			for (a = w(this.doc, a); f < b && ((a = rd(this.doc, a, e, c, d)), !a.hitSide); ++f);
			return a
		},
		moveH: M(function (a, b) {
			var c = this
			c.extendSelectionsBy(function (d) {
				return c.display.shift || c.doc.extend || d.empty() ? rd(c.doc, d.head, a, b, c.options.rtlMoveVisually) : 0 > a ? d.from() : d.to()
			}, Gb)
		}),
		deleteH: M(function (a, b) {
			var c = this.doc
			this.doc.sel.somethingSelected()
				? c.replaceSelection("", null, "+delete")
				: Va(this, function (d) {
						var e = rd(c, d.head, a, b, !1)
						return 0 > a ? { from: e, to: d.head } : { from: d.head, to: e }
				  })
		}),
		findPosV: function (a, b, c, d) {
			var e = 1
			0 > b && ((e = -1), (b = -b))
			var f = 0
			for (a = w(this.doc, a); f < b && ((a = ma(this, a, "div")), null == d ? (d = a.left) : (a.left = d), (a = Pe(this, a, e, c)), !a.hitSide); ++f);
			return a
		},
		moveV: M(function (a, b) {
			var c = this,
				d = this.doc,
				e = [],
				f = !c.display.shift && !d.extend && d.sel.somethingSelected()
			d.extendSelectionsBy(function (g) {
				if (f) return 0 > a ? g.from() : g.to()
				var k = ma(c, g.head, "div")
				null != g.goalColumn && (k.left = g.goalColumn)
				e.push(k.left)
				var l = Pe(c, k, a, b)
				"page" == b && g == d.sel.primary() && lc(c, null, Yb(c, l, "div").top - k.top)
				return l
			}, Gb)
			if (e.length) for (var g = 0; g < d.sel.ranges.length; g++) d.sel.ranges[g].goalColumn = e[g]
		}),
		findWordAt: function (a) {
			var b = u(this.doc, a.line).text,
				c = a.ch,
				d = a.ch
			if (b) {
				var e = this.getHelper(a, "wordChars")
				;(0 > a.xRel || d == b.length) && c ? --c : ++d
				for (
					var f = b.charAt(c),
						f = oc(f, e)
							? function (a) {
									return oc(a, e)
							  }
							: /\s/.test(f)
							? function (a) {
									return /\s/.test(a)
							  }
							: function (a) {
									return !/\s/.test(a) && !oc(a)
							  };
					0 < c && f(b.charAt(c - 1));

				)
					--c
				for (; d < b.length && f(b.charAt(d)); ) ++d
			}
			return new z(r(a.line, c), r(a.line, d))
		},
		toggleOverwrite: function (a) {
			if (null == a || a != this.state.overwrite) (this.state.overwrite = !this.state.overwrite) ? mb(this.display.cursorDiv, "CodeMirror-overwrite") : kb(this.display.cursorDiv, "CodeMirror-overwrite"), K(this, "overwriteToggle", this, this.state.overwrite)
		},
		hasFocus: function () {
			return this.display.input.getField() == fa()
		},
		scrollTo: M(function (a, b) {
			;(null == a && null == b) || mc(this)
			null != a && (this.curOp.scrollLeft = a)
			null != b && (this.curOp.scrollTop = b)
		}),
		getScrollInfo: function () {
			var a = this.display.scroller
			return { left: a.scrollLeft, top: a.scrollTop, height: a.scrollHeight - da(this) - this.display.barHeight, width: a.scrollWidth - da(this) - this.display.barWidth, clientHeight: Nc(this), clientWidth: pa(this) }
		},
		scrollIntoView: M(function (a, b) {
			null == a ? ((a = { from: this.doc.sel.primary().head, to: null }), null == b && (b = this.options.cursorScrollMargin)) : "number" == typeof a ? (a = { from: r(a, 0), to: null }) : null == a.from && (a = { from: a, to: null })
			a.to || (a.to = a.from)
			a.margin = b || 0
			if (null != a.from.line) mc(this), (this.curOp.scrollToPos = a)
			else {
				var c = cc(this, Math.min(a.from.left, a.to.left), Math.min(a.from.top, a.to.top) - a.margin, Math.max(a.from.right, a.to.right), Math.max(a.from.bottom, a.to.bottom) + a.margin)
				this.scrollTo(c.scrollLeft, c.scrollTop)
			}
		}),
		setSize: M(function (a, b) {
			function c(a) {
				return "number" == typeof a || /^\d+$/.test(String(a)) ? a + "px" : a
			}
			var d = this
			null != a && (d.display.wrapper.style.width = c(a))
			null != b && (d.display.wrapper.style.height = c(b))
			d.options.lineWrapping && me(this)
			var e = d.display.viewFrom
			d.doc.iter(e, d.display.viewTo, function (a) {
				if (a.widgets)
					for (var b = 0; b < a.widgets.length; b++)
						if (a.widgets[b].noHScroll) {
							na(d, e, "widget")
							break
						}
				++e
			})
			d.curOp.forceUpdate = !0
			K(d, "refresh", this)
		}),
		operation: function (a) {
			return T(this, a)
		},
		refresh: M(function () {
			var a = this.display.cachedTextHeight
			Q(this)
			this.curOp.forceUpdate = !0
			hb(this)
			this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop)
			Cc(this)
			;(null == a || 0.5 < Math.abs(a - xa(this.display))) && Ac(this)
			K(this, "refresh", this)
		}),
		swapDoc: M(function (a) {
			var b = this.doc
			b.cm = null
			Ed(this, a)
			hb(this)
			this.display.input.reset()
			this.scrollTo(a.scrollLeft, a.scrollTop)
			this.curOp.forceScroll = !0
			L(this, "swapDoc", this, b)
			return b
		}),
		getInputField: function () {
			return this.display.input.getField()
		},
		getWrapperElement: function () {
			return this.display.wrapper
		},
		getScrollerElement: function () {
			return this.display.scroller
		},
		getGutterElement: function () {
			return this.display.gutters
		}
	}
	Ya(q)
	var qf = (q.defaults = {}),
		Ka = (q.optionHandlers = {}),
		Fd = (q.Init = {
			toString: function () {
				return "CodeMirror.Init"
			}
		})
	x(
		"value",
		"",
		function (a, b) {
			a.setValue(b)
		},
		!0
	)
	x(
		"mode",
		null,
		function (a, b) {
			a.doc.modeOption = b
			zc(a)
		},
		!0
	)
	x("indentUnit", 2, zc, !0)
	x("indentWithTabs", !1)
	x("smartIndent", !0)
	x(
		"tabSize",
		4,
		function (a) {
			eb(a)
			hb(a)
			Q(a)
		},
		!0
	)
	x("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function (a, b, c) {
		a.state.specialChars = new RegExp(b.source + (b.test("\t") ? "" : "|\t"), "g")
		c != q.Init && a.refresh()
	})
	x(
		"specialCharPlaceholder",
		function (a) {
			var b = t("span", "•", "cm-invalidchar")
			b.title = "\\u" + a.charCodeAt(0).toString(16)
			b.setAttribute("aria-label", b.title)
			return b
		},
		function (a) {
			a.refresh()
		},
		!0
	)
	x("electricChars", !0)
	x(
		"inputStyle",
		ab ? "contenteditable" : "textarea",
		function () {
			throw Error("inputStyle can not (yet) be changed in a running editor")
		},
		!0
	)
	x("rtlMoveVisually", !mg)
	x("wholeLineUpdateBefore", !0)
	x(
		"theme",
		"default",
		function (a) {
			Bd(a)
			ib(a)
		},
		!0
	)
	x("keyMap", "default", function (a, b, c) {
		b = pc(b)
		;(c = c != q.Init && pc(c)) && c.detach && c.detach(a, b)
		b.attach && b.attach(a, c || null)
	})
	x("extraKeys", null)
	x(
		"lineWrapping",
		!1,
		function (a) {
			a.options.lineWrapping ? (mb(a.display.wrapper, "CodeMirror-wrap"), (a.display.sizer.style.minWidth = ""), (a.display.sizerWidth = null)) : (kb(a.display.wrapper, "CodeMirror-wrap"), Dc(a))
			Ac(a)
			Q(a)
			hb(a)
			setTimeout(function () {
				Na(a)
			}, 100)
		},
		!0
	)
	x(
		"gutters",
		[],
		function (a) {
			wc(a.options)
			ib(a)
		},
		!0
	)
	x(
		"fixedGutter",
		!0,
		function (a, b) {
			a.display.gutters.style.left = b ? Ic(a.display) + "px" : "0"
			a.refresh()
		},
		!0
	)
	x(
		"coverGutterNextToScrollbar",
		!1,
		function (a) {
			Na(a)
		},
		!0
	)
	x(
		"scrollbarStyle",
		"native",
		function (a) {
			Cd(a)
			Na(a)
			a.display.scrollbars.setScrollTop(a.doc.scrollTop)
			a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)
		},
		!0
	)
	x(
		"lineNumbers",
		!1,
		function (a) {
			wc(a.options)
			ib(a)
		},
		!0
	)
	x("firstLineNumber", 1, ib, !0)
	x(
		"lineNumberFormatter",
		function (a) {
			return a
		},
		ib,
		!0
	)
	x("showCursorWhenSelecting", !1, nb, !0)
	x("resetSelectionOnContextMenu", !0)
	x("lineWiseCopyCut", !0)
	x("readOnly", !1, function (a, b) {
		"nocursor" == b ? (db(a), a.display.input.blur(), (a.display.disabled = !0)) : ((a.display.disabled = !1), b || a.display.input.reset())
	})
	x(
		"disableInput",
		!1,
		function (a, b) {
			b || a.display.input.reset()
		},
		!0
	)
	x("dragDrop", !0, function (a, b, c) {
		!b != !(c && c != q.Init) && ((c = a.display.dragFunctions), (b = b ? v : ka), b(a.display.scroller, "dragstart", c.start), b(a.display.scroller, "dragenter", c.simple), b(a.display.scroller, "dragover", c.simple), b(a.display.scroller, "drop", c.drop))
	})
	x("cursorBlinkRate", 530)
	x("cursorScrollMargin", 0)
	x("cursorHeight", 1, nb, !0)
	x("singleCursorHeightPerLine", !0, nb, !0)
	x("workTime", 100)
	x("workDelay", 100)
	x("flattenSpans", !0, eb, !0)
	x("addModeClass", !1, eb, !0)
	x("pollInterval", 100)
	x("undoDepth", 200, function (a, b) {
		a.doc.history.undoDepth = b
	})
	x("historyEventDelay", 1250)
	x(
		"viewportMargin",
		10,
		function (a) {
			a.refresh()
		},
		!0
	)
	x("maxHighlightLength", 1e4, eb, !0)
	x("moveInputWithCursor", !0, function (a, b) {
		b || a.display.input.resetPosition()
	})
	x("tabindex", null, function (a, b) {
		a.display.input.getField().tabIndex = b || ""
	})
	x("autofocus", null)
	var pf = (q.modes = {}),
		Hb = (q.mimeModes = {})
	q.defineMode = function (a, b) {
		q.defaults.mode || "null" == a || (q.defaults.mode = a)
		2 < arguments.length && (b.dependencies = Array.prototype.slice.call(arguments, 2))
		pf[a] = b
	}
	q.defineMIME = function (a, b) {
		Hb[a] = b
	}
	q.resolveMode = function (a) {
		if ("string" == typeof a && Hb.hasOwnProperty(a)) a = Hb[a]
		else if (a && "string" == typeof a.name && Hb.hasOwnProperty(a.name)) {
			var b = Hb[a.name]
			"string" == typeof b && (b = { name: b })
			a = ff(b, a)
			a.name = b.name
		} else if ("string" == typeof a && /^[\w\-]+\/[\w\-]+\+xml$/.test(a)) return q.resolveMode("application/xml")
		return "string" == typeof a ? { name: a } : a || { name: "null" }
	}
	q.getMode = function (a, b) {
		b = q.resolveMode(b)
		var c = pf[b.name]
		if (!c) return q.getMode(a, "text/plain")
		c = c(a, b)
		if (Ib.hasOwnProperty(b.name)) {
			var d = Ib[b.name],
				e
			for (e in d) d.hasOwnProperty(e) && (c.hasOwnProperty(e) && (c["_" + e] = c[e]), (c[e] = d[e]))
		}
		c.name = b.name
		b.helperType && (c.helperType = b.helperType)
		if (b.modeProps) for (e in b.modeProps) c[e] = b.modeProps[e]
		return c
	}
	q.defineMode("null", function () {
		return {
			token: function (a) {
				a.skipToEnd()
			}
		}
	})
	q.defineMIME("text/plain", "null")
	var Ib = (q.modeExtensions = {})
	q.extendMode = function (a, b) {
		var c = Ib.hasOwnProperty(a) ? Ib[a] : (Ib[a] = {})
		V(b, c)
	}
	q.defineExtension = function (a, b) {
		q.prototype[a] = b
	}
	q.defineDocExtension = function (a, b) {
		P.prototype[a] = b
	}
	q.defineOption = x
	var yc = []
	q.defineInitHook = function (a) {
		yc.push(a)
	}
	var $a = (q.helpers = {})
	q.registerHelper = function (a, b, c) {
		$a.hasOwnProperty(a) || ($a[a] = q[a] = { _global: [] })
		$a[a][b] = c
	}
	q.registerGlobalHelper = function (a, b, c, d) {
		q.registerHelper(a, b, d)
		$a[a]._global.push({ pred: c, val: d })
	}
	var Sa = (q.copyState = function (a, b) {
			if (!0 === b) return b
			if (a.copyState) return a.copyState(b)
			var c = {},
				d
			for (d in b) {
				var e = b[d]
				e instanceof Array && (e = e.concat([]))
				c[d] = e
			}
			return c
		}),
		Df = (q.startState = function (a, b, c) {
			return a.startState ? a.startState(b, c) : !0
		})
	q.innerMode = function (a, b) {
		for (; a.innerMode; ) {
			var c = a.innerMode(b)
			if (!c || c.mode == a) break
			b = c.state
			a = c.mode
		}
		return c || { mode: a, state: b }
	}
	var ic = (q.commands = {
			selectAll: function (a) {
				a.setSelection(r(a.firstLine(), 0), r(a.lastLine()), ha)
			},
			singleSelection: function (a) {
				a.setSelection(a.getCursor("anchor"), a.getCursor("head"), ha)
			},
			killLine: function (a) {
				Va(a, function (b) {
					if (b.empty()) {
						var c = u(a.doc, b.head.line).text.length
						return b.head.ch == c && b.head.line < a.lastLine() ? { from: b.head, to: r(b.head.line + 1, 0) } : { from: b.head, to: r(b.head.line, c) }
					}
					return { from: b.from(), to: b.to() }
				})
			},
			deleteLine: function (a) {
				Va(a, function (b) {
					return { from: r(b.from().line, 0), to: w(a.doc, r(b.to().line + 1, 0)) }
				})
			},
			delLineLeft: function (a) {
				Va(a, function (a) {
					return { from: r(a.from().line, 0), to: a.from() }
				})
			},
			delWrappedLineLeft: function (a) {
				Va(a, function (b) {
					var c = a.charCoords(b.head, "div").top + 5
					return { from: a.coordsChar({ left: 0, top: c }, "div"), to: b.from() }
				})
			},
			delWrappedLineRight: function (a) {
				Va(a, function (b) {
					var c = a.charCoords(b.head, "div").top + 5,
						c = a.coordsChar({ left: a.display.lineDiv.offsetWidth + 100, top: c }, "div")
					return { from: b.from(), to: c }
				})
			},
			undo: function (a) {
				a.undo()
			},
			redo: function (a) {
				a.redo()
			},
			undoSelection: function (a) {
				a.undoSelection()
			},
			redoSelection: function (a) {
				a.redoSelection()
			},
			goDocStart: function (a) {
				a.extendSelection(r(a.firstLine(), 0))
			},
			goDocEnd: function (a) {
				a.extendSelection(r(a.lastLine()))
			},
			goLineStart: function (a) {
				a.extendSelectionsBy(
					function (b) {
						return kf(a, b.head.line)
					},
					{ origin: "+move", bias: 1 }
				)
			},
			goLineStartSmart: function (a) {
				a.extendSelectionsBy(
					function (b) {
						return lf(a, b.head)
					},
					{ origin: "+move", bias: 1 }
				)
			},
			goLineEnd: function (a) {
				a.extendSelectionsBy(
					function (b) {
						b = b.head.line
						for (var c, d = u(a.doc, b); (c = Aa(d, !1)); ) (d = c.find(1, !0).line), (b = null)
						c = (c = Y(d)) ? (c[0].level % 2 ? ac(d) : bc(d)) : d.text.length
						return r(null == b ? F(d) : b, c)
					},
					{ origin: "+move", bias: -1 }
				)
			},
			goLineRight: function (a) {
				a.extendSelectionsBy(function (b) {
					b = a.charCoords(b.head, "div").top + 5
					return a.coordsChar({ left: a.display.lineDiv.offsetWidth + 100, top: b }, "div")
				}, Gb)
			},
			goLineLeft: function (a) {
				a.extendSelectionsBy(function (b) {
					b = a.charCoords(b.head, "div").top + 5
					return a.coordsChar({ left: 0, top: b }, "div")
				}, Gb)
			},
			goLineLeftSmart: function (a) {
				a.extendSelectionsBy(function (b) {
					var c = a.charCoords(b.head, "div").top + 5,
						c = a.coordsChar({ left: 0, top: c }, "div")
					return c.ch < a.getLine(c.line).search(/\S/) ? lf(a, b.head) : c
				}, Gb)
			},
			goLineUp: function (a) {
				a.moveV(-1, "line")
			},
			goLineDown: function (a) {
				a.moveV(1, "line")
			},
			goPageUp: function (a) {
				a.moveV(-1, "page")
			},
			goPageDown: function (a) {
				a.moveV(1, "page")
			},
			goCharLeft: function (a) {
				a.moveH(-1, "char")
			},
			goCharRight: function (a) {
				a.moveH(1, "char")
			},
			goColumnLeft: function (a) {
				a.moveH(-1, "column")
			},
			goColumnRight: function (a) {
				a.moveH(1, "column")
			},
			goWordLeft: function (a) {
				a.moveH(-1, "word")
			},
			goGroupRight: function (a) {
				a.moveH(1, "group")
			},
			goGroupLeft: function (a) {
				a.moveH(-1, "group")
			},
			goWordRight: function (a) {
				a.moveH(1, "word")
			},
			delCharBefore: function (a) {
				a.deleteH(-1, "char")
			},
			delCharAfter: function (a) {
				a.deleteH(1, "char")
			},
			delWordBefore: function (a) {
				a.deleteH(-1, "word")
			},
			delWordAfter: function (a) {
				a.deleteH(1, "word")
			},
			delGroupBefore: function (a) {
				a.deleteH(-1, "group")
			},
			delGroupAfter: function (a) {
				a.deleteH(1, "group")
			},
			indentAuto: function (a) {
				a.indentSelection("smart")
			},
			indentMore: function (a) {
				a.indentSelection("add")
			},
			indentLess: function (a) {
				a.indentSelection("subtract")
			},
			insertTab: function (a) {
				a.replaceSelection("\t")
			},
			insertSoftTab: function (a) {
				for (var b = [], c = a.listSelections(), d = a.options.tabSize, e = 0; e < c.length; e++) {
					var f = c[e].from(),
						f = aa(a.getLine(f.line), f.ch, d)
					b.push(Array(d - (f % d) + 1).join(" "))
				}
				a.replaceSelections(b)
			},
			defaultTab: function (a) {
				a.somethingSelected() ? a.indentSelection("add") : a.execCommand("insertTab")
			},
			transposeChars: function (a) {
				T(a, function () {
					for (var b = a.listSelections(), c = [], d = 0; d < b.length; d++) {
						var e = b[d].head,
							f = u(a.doc, e.line).text
						if (f)
							if ((e.ch == f.length && (e = new r(e.line, e.ch - 1)), 0 < e.ch)) (e = new r(e.line, e.ch + 1)), a.replaceRange(f.charAt(e.ch - 1) + f.charAt(e.ch - 2), r(e.line, e.ch - 2), e, "+transpose")
							else if (e.line > a.doc.first) {
								var g = u(a.doc, e.line - 1).text
								g && a.replaceRange(f.charAt(0) + "\n" + g.charAt(g.length - 1), r(e.line - 1, g.length - 1), r(e.line, 1), "+transpose")
							}
						c.push(new z(e, e))
					}
					a.setSelections(c)
				})
			},
			newlineAndIndent: function (a) {
				T(a, function () {
					for (var b = a.listSelections().length, c = 0; c < b; c++) {
						var d = a.listSelections()[c]
						a.replaceRange("\n", d.anchor, d.head, "+input")
						a.indentLine(d.from().line + 1, null, !0)
						Pa(a)
					}
				})
			},
			toggleOverwrite: function (a) {
				a.toggleOverwrite()
			}
		}),
		ua = (q.keyMap = {})
	ua.basic = { Left: "goCharLeft", Right: "goCharRight", Up: "goLineUp", Down: "goLineDown", End: "goLineEnd", Home: "goLineStartSmart", PageUp: "goPageUp", PageDown: "goPageDown", Delete: "delCharAfter", Backspace: "delCharBefore", "Shift-Backspace": "delCharBefore", Tab: "defaultTab", "Shift-Tab": "indentAuto", Enter: "newlineAndIndent", Insert: "toggleOverwrite", Esc: "singleSelection" }
	ua.pcDefault = {
		"Ctrl-A": "selectAll",
		"Ctrl-D": "deleteLine",
		"Ctrl-Z": "undo",
		"Shift-Ctrl-Z": "redo",
		"Ctrl-Y": "redo",
		"Ctrl-Home": "goDocStart",
		"Ctrl-End": "goDocEnd",
		"Ctrl-Up": "goLineUp",
		"Ctrl-Down": "goLineDown",
		"Ctrl-Left": "goGroupLeft",
		"Ctrl-Right": "goGroupRight",
		"Alt-Left": "goLineStart",
		"Alt-Right": "goLineEnd",
		"Ctrl-Backspace": "delGroupBefore",
		"Ctrl-Delete": "delGroupAfter",
		"Ctrl-S": "save",
		"Ctrl-F": "find",
		"Ctrl-G": "findNext",
		"Shift-Ctrl-G": "findPrev",
		"Shift-Ctrl-F": "replace",
		"Shift-Ctrl-R": "replaceAll",
		"Ctrl-[": "indentLess",
		"Ctrl-]": "indentMore",
		"Ctrl-U": "undoSelection",
		"Shift-Ctrl-U": "redoSelection",
		"Alt-U": "redoSelection",
		fallthrough: "basic"
	}
	ua.emacsy = { "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars" }
	ua.macDefault = {
		"Cmd-A": "selectAll",
		"Cmd-D": "deleteLine",
		"Cmd-Z": "undo",
		"Shift-Cmd-Z": "redo",
		"Cmd-Y": "redo",
		"Cmd-Home": "goDocStart",
		"Cmd-Up": "goDocStart",
		"Cmd-End": "goDocEnd",
		"Cmd-Down": "goDocEnd",
		"Alt-Left": "goGroupLeft",
		"Alt-Right": "goGroupRight",
		"Cmd-Left": "goLineLeft",
		"Cmd-Right": "goLineRight",
		"Alt-Backspace": "delGroupBefore",
		"Ctrl-Alt-Backspace": "delGroupAfter",
		"Alt-Delete": "delGroupAfter",
		"Cmd-S": "save",
		"Cmd-F": "find",
		"Cmd-G": "findNext",
		"Shift-Cmd-G": "findPrev",
		"Cmd-Alt-F": "replace",
		"Shift-Cmd-Alt-F": "replaceAll",
		"Cmd-[": "indentLess",
		"Cmd-]": "indentMore",
		"Cmd-Backspace": "delWrappedLineLeft",
		"Cmd-Delete": "delWrappedLineRight",
		"Cmd-U": "undoSelection",
		"Shift-Cmd-U": "redoSelection",
		"Ctrl-Up": "goDocStart",
		"Ctrl-Down": "goDocEnd",
		fallthrough: ["basic", "emacsy"]
	}
	ua["default"] = W ? ua.macDefault : ua.pcDefault
	q.normalizeKeyMap = function (a) {
		var b = {},
			c
		for (c in a)
			if (a.hasOwnProperty(c)) {
				var d = a[c]
				if (!/^(name|fallthrough|(de|at)tach)$/.test(c)) {
					if ("..." != d)
						for (var e = ob(c.split(" "), Wf), f = 0; f < e.length; f++) {
							var g, h
							f == e.length - 1 ? ((h = c), (g = d)) : ((h = e.slice(0, f + 1).join(" ")), (g = "..."))
							var k = b[h]
							if (!k) b[h] = g
							else if (k != g) throw Error("Inconsistent bindings for " + h)
						}
					delete a[c]
				}
			}
		for (var l in b) a[l] = b[l]
		return a
	}
	var xb = (q.lookupKey = function (a, b, c, d) {
			b = pc(b)
			var e = b.call ? b.call(a, d) : b[a]
			if (!1 === e) return "nothing"
			if ("..." === e) return "multi"
			if (null != e && c(e)) return "handled"
			if (b.fallthrough) {
				if ("[object Array]" != Object.prototype.toString.call(b.fallthrough)) return xb(a, b.fallthrough, c, d)
				for (e = 0; e < b.fallthrough.length; e++) {
					var f = xb(a, b.fallthrough[e], c, d)
					if (f) return f
				}
			}
		}),
		Pf = (q.isModifierKey = function (a) {
			a = "string" == typeof a ? a : va[a.keyCode]
			return "Ctrl" == a || "Alt" == a || "Shift" == a || "Mod" == a
		}),
		Rf = (q.keyName = function (a, b) {
			if (ba && 34 == a.keyCode && a["char"]) return !1
			var c = va[a.keyCode],
				d = c
			if (null == d || a.altGraphKey) return !1
			a.altKey && "Alt" != c && (d = "Alt-" + d)
			;(of ? a.metaKey : a.ctrlKey) && "Ctrl" != c && (d = "Ctrl-" + d)
			;(of ? a.ctrlKey : a.metaKey) && "Cmd" != c && (d = "Cmd-" + d)
			!b && a.shiftKey && "Shift" != c && (d = "Shift-" + d)
			return d
		})
	q.fromTextArea = function (a, b) {
		function c() {
			a.value = k.getValue()
		}
		b = b ? V(b) : {}
		b.value = a.value
		!b.tabindex && a.tabIndex && (b.tabindex = a.tabIndex)
		!b.placeholder && a.placeholder && (b.placeholder = a.placeholder)
		if (null == b.autofocus) {
			var d = fa()
			b.autofocus = d == a || (null != a.getAttribute("autofocus") && d == document.body)
		}
		if (a.form && (v(a.form, "submit", c), !b.leaveSubmitMethodAlone)) {
			var e = a.form,
				f = e.submit
			try {
				var g = (e.submit = function () {
					c()
					e.submit = f
					e.submit()
					e.submit = g
				})
			} catch (h) {}
		}
		b.finishInit = function (b) {
			b.save = c
			b.getTextArea = function () {
				return a
			}
			b.toTextArea = function () {
				b.toTextArea = isNaN
				c()
				a.parentNode.removeChild(b.getWrapperElement())
				a.style.display = ""
				a.form && (ka(a.form, "submit", c), "function" == typeof a.form.submit && (a.form.submit = f))
			}
		}
		a.style.display = "none"
		var k = q(function (b) {
			a.parentNode.insertBefore(b, a.nextSibling)
		}, b)
		return k
	}
	var tc = (q.StringStream = function (a, b) {
		this.pos = this.start = 0
		this.string = a
		this.tabSize = b || 8
		this.lineStart = this.lastColumnPos = this.lastColumnValue = 0
	})
	tc.prototype = {
		eol: function () {
			return this.pos >= this.string.length
		},
		sol: function () {
			return this.pos == this.lineStart
		},
		peek: function () {
			return this.string.charAt(this.pos) || void 0
		},
		next: function () {
			if (this.pos < this.string.length) return this.string.charAt(this.pos++)
		},
		eat: function (a) {
			var b = this.string.charAt(this.pos)
			if ("string" == typeof a ? b == a : b && (a.test ? a.test(b) : a(b))) return ++this.pos, b
		},
		eatWhile: function (a) {
			for (var b = this.pos; this.eat(a); );
			return this.pos > b
		},
		eatSpace: function () {
			for (var a = this.pos; /[\s\u00a0]/.test(this.string.charAt(this.pos)); ) ++this.pos
			return this.pos > a
		},
		skipToEnd: function () {
			this.pos = this.string.length
		},
		skipTo: function (a) {
			a = this.string.indexOf(a, this.pos)
			if (-1 < a) return (this.pos = a), !0
		},
		backUp: function (a) {
			this.pos -= a
		},
		column: function () {
			this.lastColumnPos < this.start && ((this.lastColumnValue = aa(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue)), (this.lastColumnPos = this.start))
			return this.lastColumnValue - (this.lineStart ? aa(this.string, this.lineStart, this.tabSize) : 0)
		},
		indentation: function () {
			return aa(this.string, null, this.tabSize) - (this.lineStart ? aa(this.string, this.lineStart, this.tabSize) : 0)
		},
		match: function (a, b, c) {
			if ("string" == typeof a) {
				var d = function (a) {
						return c ? a.toLowerCase() : a
					},
					e = this.string.substr(this.pos, a.length)
				if (d(e) == d(a)) return !1 !== b && (this.pos += a.length), !0
			} else {
				if ((a = this.string.slice(this.pos).match(a)) && 0 < a.index) return null
				a && !1 !== b && (this.pos += a[0].length)
				return a
			}
		},
		current: function () {
			return this.string.slice(this.start, this.pos)
		},
		hideFirstChars: function (a, b) {
			this.lineStart += a
			try {
				return b()
			} finally {
				this.lineStart -= a
			}
		}
	}
	var sd = 0,
		Ha = (q.TextMarker = function (a, b) {
			this.lines = []
			this.type = b
			this.doc = a
			this.id = ++sd
		})
	Ya(Ha)
	Ha.prototype.clear = function () {
		if (!this.explicitlyCleared) {
			var a = this.doc.cm,
				b = a && !a.curOp
			b && Ja(a)
			if (S(this, "clear")) {
				var c = this.find()
				c && L(this, "clear", c.from, c.to)
			}
			for (var d = (c = null), e = 0; e < this.lines.length; ++e) {
				var f = this.lines[e],
					g = zb(f.markedSpans, this)
				a && !this.collapsed ? na(a, F(f), "text") : a && (null != g.to && (d = F(f)), null != g.from && (c = F(f)))
				for (var h = f, k = f.markedSpans, l = g, m = void 0, p = 0; p < k.length; ++p) k[p] != l && (m || (m = [])).push(k[p])
				h.markedSpans = m
				null == g.from && this.collapsed && !ya(this.doc, f) && a && ca(f, xa(a.display))
			}
			if (a && this.collapsed && !a.options.lineWrapping) for (e = 0; e < this.lines.length; ++e) (f = ia(this.lines[e])), (g = Kb(f)), g > a.display.maxLineLength && ((a.display.maxLine = f), (a.display.maxLineLength = g), (a.display.maxLineChanged = !0))
			null != c && a && this.collapsed && Q(a, c, d + 1)
			this.lines.length = 0
			this.explicitlyCleared = !0
			this.atomic && this.doc.cantEdit && ((this.doc.cantEdit = !1), a && ge(a.doc))
			a && L(a, "markerCleared", a, this)
			b && La(a)
			this.parent && this.parent.clear()
		}
	}
	Ha.prototype.find = function (a, b) {
		null == a && "bookmark" == this.type && (a = 1)
		for (var c, d, e = 0; e < this.lines.length; ++e) {
			var f = this.lines[e],
				g = zb(f.markedSpans, this)
			if (null != g.from && ((c = r(b ? f : F(f), g.from)), -1 == a)) return c
			if (null != g.to && ((d = r(b ? f : F(f), g.to)), 1 == a)) return d
		}
		return c && { from: c, to: d }
	}
	Ha.prototype.changed = function () {
		var a = this.find(-1, !0),
			b = this,
			c = this.doc.cm
		a &&
			c &&
			T(c, function () {
				var d = a.line,
					e = F(a.line)
				if ((e = Vc(c, e))) le(e), (c.curOp.selectionChanged = c.curOp.forceUpdate = !0)
				c.curOp.updateMaxLine = !0
				ya(b.doc, d) || null == b.height || ((e = b.height), (b.height = null), (e = ub(b) - e) && ca(d, d.height + e))
			})
	}
	Ha.prototype.attachLine = function (a) {
		if (!this.lines.length && this.doc.cm) {
			var b = this.doc.cm.curOp
			;(b.maybeHiddenMarkers && -1 != D(b.maybeHiddenMarkers, this)) || (b.maybeUnhiddenMarkers || (b.maybeUnhiddenMarkers = [])).push(this)
		}
		this.lines.push(a)
	}
	Ha.prototype.detachLine = function (a) {
		this.lines.splice(D(this.lines, a), 1)
		!this.lines.length && this.doc.cm && ((a = this.doc.cm.curOp), (a.maybeHiddenMarkers || (a.maybeHiddenMarkers = [])).push(this))
	}
	var sd = 0,
		rc = (q.SharedTextMarker = function (a, b) {
			this.markers = a
			this.primary = b
			for (var c = 0; c < a.length; ++c) a[c].parent = this
		})
	Ya(rc)
	rc.prototype.clear = function () {
		if (!this.explicitlyCleared) {
			this.explicitlyCleared = !0
			for (var a = 0; a < this.markers.length; ++a) this.markers[a].clear()
			L(this, "clear")
		}
	}
	rc.prototype.find = function (a, b) {
		return this.primary.find(a, b)
	}
	var sc = (q.LineWidget = function (a, b, c) {
		if (c) for (var d in c) c.hasOwnProperty(d) && (this[d] = c[d])
		this.doc = a
		this.node = b
	})
	Ya(sc)
	sc.prototype.clear = function () {
		var a = this.doc.cm,
			b = this.line.widgets,
			c = this.line,
			d = F(c)
		if (null != d && b) {
			for (var e = 0; e < b.length; ++e) b[e] == this && b.splice(e--, 1)
			b.length || (c.widgets = null)
			var f = ub(this)
			ca(c, Math.max(0, c.height - f))
			a &&
				T(a, function () {
					var b = -f
					ea(c) < ((a.curOp && a.curOp.scrollTop) || a.doc.scrollTop) && lc(a, null, b)
					na(a, d, "widget")
				})
		}
	}
	sc.prototype.changed = function () {
		var a = this.height,
			b = this.doc.cm,
			c = this.line
		this.height = null
		var d = ub(this) - a
		d &&
			(ca(c, c.height + d),
			b &&
				T(b, function () {
					b.curOp.forceUpdate = !0
					ea(c) < ((b.curOp && b.curOp.scrollTop) || b.doc.scrollTop) && lc(b, null, d)
				}))
	}
	var Ab = (q.Line = function (a, b, c) {
		this.text = a
		Ue(this, b)
		this.height = c ? c(this) : 1
	})
	Ya(Ab)
	Ab.prototype.lineNo = function () {
		return F(this)
	}
	var bg = {},
		ag = {}
	Bb.prototype = {
		chunkSize: function () {
			return this.lines.length
		},
		removeInner: function (a, b) {
			for (var c = a, d = a + b; c < d; ++c) {
				var e = this.lines[c]
				this.height -= e.height
				var f = e
				f.parent = null
				Te(f)
				L(e, "delete")
			}
			this.lines.splice(a, b)
		},
		collapse: function (a) {
			a.push.apply(a, this.lines)
		},
		insertInner: function (a, b, c) {
			this.height += c
			this.lines = this.lines.slice(0, a).concat(b).concat(this.lines.slice(a))
			for (a = 0; a < b.length; ++a) b[a].parent = this
		},
		iterN: function (a, b, c) {
			for (b = a + b; a < b; ++a) if (c(this.lines[a])) return !0
		}
	}
	Cb.prototype = {
		chunkSize: function () {
			return this.size
		},
		removeInner: function (a, b) {
			this.size -= b
			for (var c = 0; c < this.children.length; ++c) {
				var d = this.children[c],
					e = d.chunkSize()
				if (a < e) {
					var f = Math.min(b, e - a),
						g = d.height
					d.removeInner(a, f)
					this.height -= g - d.height
					e == f && (this.children.splice(c--, 1), (d.parent = null))
					if (0 == (b -= f)) break
					a = 0
				} else a -= e
			}
			25 > this.size - b && (1 < this.children.length || !(this.children[0] instanceof Bb)) && ((c = []), this.collapse(c), (this.children = [new Bb(c)]), (this.children[0].parent = this))
		},
		collapse: function (a) {
			for (var b = 0; b < this.children.length; ++b) this.children[b].collapse(a)
		},
		insertInner: function (a, b, c) {
			this.size += b.length
			this.height += c
			for (var d = 0; d < this.children.length; ++d) {
				var e = this.children[d],
					f = e.chunkSize()
				if (a <= f) {
					e.insertInner(a, b, c)
					if (e.lines && 50 < e.lines.length) {
						for (; 50 < e.lines.length; ) (a = e.lines.splice(e.lines.length - 25, 25)), (a = new Bb(a)), (e.height -= a.height), this.children.splice(d + 1, 0, a), (a.parent = this)
						this.maybeSpill()
					}
					break
				}
				a -= f
			}
		},
		maybeSpill: function () {
			if (!(10 >= this.children.length)) {
				var a = this
				do {
					var b = a.children.splice(a.children.length - 5, 5),
						b = new Cb(b)
					if (a.parent) {
						a.size -= b.size
						a.height -= b.height
						var c = D(a.parent.children, a)
						a.parent.children.splice(c + 1, 0, b)
					} else (c = new Cb(a.children)), (c.parent = a), (a.children = [c, b]), (a = c)
					b.parent = a.parent
				} while (10 < a.children.length)
				a.parent.maybeSpill()
			}
		},
		iterN: function (a, b, c) {
			for (var d = 0; d < this.children.length; ++d) {
				var e = this.children[d],
					f = e.chunkSize()
				if (a < f) {
					f = Math.min(b, f - a)
					if (e.iterN(a, f, c)) return !0
					if (0 == (b -= f)) break
					a = 0
				} else a -= f
			}
		}
	}
	var og = 0,
		P = (q.Doc = function (a, b, c) {
			if (!(this instanceof P)) return new P(a, b, c)
			null == c && (c = 0)
			Cb.call(this, [new Bb([new Ab("", null)])])
			this.first = c
			this.scrollTop = this.scrollLeft = 0
			this.cantEdit = !1
			this.cleanGeneration = 1
			this.frontier = c
			c = r(c, 0)
			this.sel = ga(c)
			this.history = new uc(null)
			this.id = ++og
			this.modeOption = b
			"string" == typeof a && (a = sa(a))
			qd(this, { from: c, to: c, text: a })
			H(this, ga(c), ha)
		})
	P.prototype = ff(Cb.prototype, {
		constructor: P,
		iter: function (a, b, c) {
			c ? this.iterN(a - this.first, b - a, c) : this.iterN(this.first, this.first + this.size, a)
		},
		insert: function (a, b) {
			for (var c = 0, d = 0; d < b.length; ++d) c += b[d].height
			this.insertInner(a - this.first, b, c)
		},
		remove: function (a, b) {
			this.removeInner(a - this.first, b)
		},
		getValue: function (a) {
			var b = xd(this, this.first, this.first + this.size)
			return !1 === a ? b : b.join(a || "\n")
		},
		setValue: N(function (a) {
			var b = r(this.first, 0),
				c = this.first + this.size - 1
			Oa(this, { from: b, to: r(c, u(this, c).text.length), text: sa(a), origin: "setValue", full: !0 }, !0)
			H(this, ga(b))
		}),
		replaceRange: function (a, b, c, d) {
			b = w(this, b)
			c = c ? w(this, c) : b
			wb(this, a, b, c, d)
		},
		getRange: function (a, b, c) {
			a = Da(this, w(this, a), w(this, b))
			return !1 === c ? a : a.join(c || "\n")
		},
		getLine: function (a) {
			return (a = this.getLineHandle(a)) && a.text
		},
		getLineHandle: function (a) {
			if (qb(this, a)) return u(this, a)
		},
		getLineNumber: function (a) {
			return F(a)
		},
		getLineHandleVisualStart: function (a) {
			"number" == typeof a && (a = u(this, a))
			return ia(a)
		},
		lineCount: function () {
			return this.size
		},
		firstLine: function () {
			return this.first
		},
		lastLine: function () {
			return this.first + this.size - 1
		},
		clipPos: function (a) {
			return w(this, a)
		},
		getCursor: function (a) {
			var b = this.sel.primary()
			return null == a || "head" == a ? b.head : "anchor" == a ? b.anchor : "end" == a || "to" == a || !1 === a ? b.to() : b.from()
		},
		listSelections: function () {
			return this.sel.ranges
		},
		somethingSelected: function () {
			return this.sel.somethingSelected()
		},
		setCursor: N(function (a, b, c) {
			a = w(this, "number" == typeof a ? r(a, b || 0) : a)
			H(this, ga(a, null), c)
		}),
		setSelection: N(function (a, b, c) {
			var d = w(this, a)
			a = w(this, b || a)
			H(this, ga(d, a), c)
		}),
		extendSelection: N(function (a, b, c) {
			Ub(this, w(this, a), b && w(this, b), c)
		}),
		extendSelections: N(function (a, b) {
			for (var c = [], d = 0; d < a.length; d++) c[d] = w(this, a[d])
			ae(this, c)
		}),
		extendSelectionsBy: N(function (a, b) {
			ae(this, ob(this.sel.ranges, a), b)
		}),
		setSelections: N(function (a, b, c) {
			if (a.length) {
				for (var d = 0, e = []; d < a.length; d++) e[d] = new z(w(this, a[d].anchor), w(this, a[d].head))
				null == b && (b = Math.min(a.length - 1, this.sel.primIndex))
				H(this, Z(e, b), c)
			}
		}),
		addSelection: N(function (a, b, c) {
			var d = this.sel.ranges.slice(0)
			d.push(new z(w(this, a), w(this, b || a)))
			H(this, Z(d, d.length - 1), c)
		}),
		getSelection: function (a) {
			for (var b = this.sel.ranges, c, d = 0; d < b.length; d++) {
				var e = Da(this, b[d].from(), b[d].to())
				c = c ? c.concat(e) : e
			}
			return !1 === a ? c : c.join(a || "\n")
		},
		getSelections: function (a) {
			for (var b = [], c = this.sel.ranges, d = 0; d < c.length; d++) {
				var e = Da(this, c[d].from(), c[d].to())
				!1 !== a && (e = e.join(a || "\n"))
				b[d] = e
			}
			return b
		},
		replaceSelection: function (a, b, c) {
			for (var d = [], e = 0; e < this.sel.ranges.length; e++) d[e] = a
			this.replaceSelections(d, b, c || "+input")
		},
		replaceSelections: N(function (a, b, c) {
			for (var d = [], e = this.sel, f = 0; f < e.ranges.length; f++) {
				var g = e.ranges[f]
				d[f] = { from: g.from(), to: g.to(), text: sa(a[f]), origin: c }
			}
			if ((f = b && "end" != b)) {
				f = []
				c = a = r(this.first, 0)
				for (e = 0; e < d.length; e++) {
					var h = d[e],
						g = Ee(h.from, a, c),
						k = Ee(ta(h), a, c)
					a = h.to
					c = k
					"around" == b ? ((h = this.sel.ranges[e]), (h = 0 > y(h.head, h.anchor)), (f[e] = new z(h ? k : g, h ? g : k))) : (f[e] = new z(g, g))
				}
				f = new la(f, this.sel.primIndex)
			}
			b = f
			for (f = d.length - 1; 0 <= f; f--) Oa(this, d[f])
			b ? be(this, b) : this.cm && Pa(this.cm)
		}),
		undo: N(function () {
			kc(this, "undo")
		}),
		redo: N(function () {
			kc(this, "redo")
		}),
		undoSelection: N(function () {
			kc(this, "undo", !0)
		}),
		redoSelection: N(function () {
			kc(this, "redo", !0)
		}),
		setExtending: function (a) {
			this.extend = a
		},
		getExtending: function () {
			return this.extend
		},
		historySize: function () {
			for (var a = this.history, b = 0, c = 0, d = 0; d < a.done.length; d++) a.done[d].ranges || ++b
			for (d = 0; d < a.undone.length; d++) a.undone[d].ranges || ++c
			return { undo: b, redo: c }
		},
		clearHistory: function () {
			this.history = new uc(this.history.maxGeneration)
		},
		markClean: function () {
			this.cleanGeneration = this.changeGeneration(!0)
		},
		changeGeneration: function (a) {
			a && (this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null)
			return this.history.generation
		},
		isClean: function (a) {
			return this.history.generation == (a || this.cleanGeneration)
		},
		getHistory: function () {
			return { done: Xa(this.history.done), undone: Xa(this.history.undone) }
		},
		setHistory: function (a) {
			var b = (this.history = new uc(this.history.maxGeneration))
			b.done = Xa(a.done.slice(0), null, !0)
			b.undone = Xa(a.undone.slice(0), null, !0)
		},
		addLineClass: N(function (a, b, c) {
			return nc(this, a, "gutter" == b ? "gutter" : "class", function (a) {
				var e = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass"
				if (a[e]) {
					if (Fb(c).test(a[e])) return !1
					a[e] += " " + c
				} else a[e] = c
				return !0
			})
		}),
		removeLineClass: N(function (a, b, c) {
			return nc(this, a, "gutter" == b ? "gutter" : "class", function (a) {
				var e = "text" == b ? "textClass" : "background" == b ? "bgClass" : "gutter" == b ? "gutterClass" : "wrapClass",
					f = a[e]
				if (f)
					if (null == c) a[e] = null
					else {
						var g = f.match(Fb(c))
						if (!g) return !1
						var h = g.index + g[0].length
						a[e] = f.slice(0, g.index) + (g.index && h != f.length ? " " : "") + f.slice(h) || null
					}
				else return !1
				return !0
			})
		}),
		addLineWidget: N(function (a, b, c) {
			return $f(this, a, b, c)
		}),
		removeLineWidget: function (a) {
			a.clear()
		},
		markText: function (a, b, c) {
			return Wa(this, w(this, a), w(this, b), c, "range")
		},
		setBookmark: function (a, b) {
			var c = { replacedWith: b && (null == b.nodeType ? b.widget : b), insertLeft: b && b.insertLeft, clearWhenEmpty: !1, shared: b && b.shared, handleMouseEvents: b && b.handleMouseEvents }
			a = w(this, a)
			return Wa(this, a, a, c, "bookmark")
		},
		findMarksAt: function (a) {
			a = w(this, a)
			var b = [],
				c = u(this, a.line).markedSpans
			if (c)
				for (var d = 0; d < c.length; ++d) {
					var e = c[d]
					;(null == e.from || e.from <= a.ch) && (null == e.to || e.to >= a.ch) && b.push(e.marker.parent || e.marker)
				}
			return b
		},
		findMarks: function (a, b, c) {
			a = w(this, a)
			b = w(this, b)
			var d = [],
				e = a.line
			this.iter(a.line, b.line + 1, function (f) {
				if ((f = f.markedSpans))
					for (var g = 0; g < f.length; g++) {
						var h = f[g]
						;(e == a.line && a.ch > h.to) || (null == h.from && e != a.line) || (e == b.line && h.from > b.ch) || (c && !c(h.marker)) || d.push(h.marker.parent || h.marker)
					}
				++e
			})
			return d
		},
		getAllMarks: function () {
			var a = []
			this.iter(function (b) {
				if ((b = b.markedSpans)) for (var c = 0; c < b.length; ++c) null != b[c].from && a.push(b[c].marker)
			})
			return a
		},
		posFromIndex: function (a) {
			var b,
				c = this.first
			this.iter(function (d) {
				d = d.text.length + 1
				if (d > a) return (b = a), !0
				a -= d
				++c
			})
			return w(this, r(c, b))
		},
		indexFromPos: function (a) {
			a = w(this, a)
			var b = a.ch
			if (a.line < this.first || 0 > a.ch) return 0
			this.iter(this.first, a.line, function (a) {
				b += a.text.length + 1
			})
			return b
		},
		copy: function (a) {
			var b = new P(xd(this, this.first, this.first + this.size), this.modeOption, this.first)
			b.scrollTop = this.scrollTop
			b.scrollLeft = this.scrollLeft
			b.sel = this.sel
			b.extend = !1
			a && ((b.history.undoDepth = this.history.undoDepth), b.setHistory(this.getHistory()))
			return b
		},
		linkedDoc: function (a) {
			a || (a = {})
			var b = this.first,
				c = this.first + this.size
			null != a.from && a.from > b && (b = a.from)
			null != a.to && a.to < c && (c = a.to)
			b = new P(xd(this, b, c), a.mode || this.modeOption, b)
			a.sharedHist && (b.history = this.history)
			;(this.linked || (this.linked = [])).push({ doc: b, sharedHist: a.sharedHist })
			b.linked = [{ doc: this, isParent: !0, sharedHist: a.sharedHist }]
			a = Re(this)
			for (c = 0; c < a.length; c++) {
				var d = a[c],
					e = d.find(),
					f = b.clipPos(e.from),
					e = b.clipPos(e.to)
				y(f, e) && ((f = Wa(b, f, e, d.primary, d.primary.type)), d.markers.push(f), (f.parent = d))
			}
			return b
		},
		unlinkDoc: function (a) {
			a instanceof q && (a = a.doc)
			if (this.linked)
				for (var b = 0; b < this.linked.length; ++b)
					if (this.linked[b].doc == a) {
						this.linked.splice(b, 1)
						a.unlinkDoc(this)
						Yf(Re(this))
						break
					}
			if (a.history == this.history) {
				var c = [a.id]
				Ga(
					a,
					function (a) {
						c.push(a.id)
					},
					!0
				)
				a.history = new uc(null)
				a.history.done = Xa(this.history.done, c)
				a.history.undone = Xa(this.history.undone, c)
			}
		},
		iterLinkedDocs: function (a) {
			Ga(this, a)
		},
		getMode: function () {
			return this.mode
		},
		getEditor: function () {
			return this.cm
		}
	})
	P.prototype.eachLine = P.prototype.iter
	var pg = ["iter", "insert", "remove", "copy", "getEditor"],
		Jb
	for (Jb in P.prototype)
		P.prototype.hasOwnProperty(Jb) &&
			0 > D(pg, Jb) &&
			(q.prototype[Jb] = (function (a) {
				return function () {
					return a.apply(this.doc, arguments)
				}
			})(P.prototype[Jb]))
	Ya(P)
	var O = (q.e_preventDefault = function (a) {
			a.preventDefault ? a.preventDefault() : (a.returnValue = !1)
		}),
		qg = (q.e_stopPropagation = function (a) {
			a.stopPropagation ? a.stopPropagation() : (a.cancelBubble = !0)
		}),
		jd = (q.e_stop = function (a) {
			O(a)
			qg(a)
		}),
		v = (q.on = function (a, b, c) {
			a.addEventListener ? a.addEventListener(b, c, !1) : a.attachEvent ? a.attachEvent("on" + b, c) : ((a = a._handlers || (a._handlers = {})), (a[b] || (a[b] = [])).push(c))
		}),
		ka = (q.off = function (a, b, c) {
			if (a.removeEventListener) a.removeEventListener(b, c, !1)
			else if (a.detachEvent) a.detachEvent("on" + b, c)
			else if ((a = a._handlers && a._handlers[b]))
				for (b = 0; b < a.length; ++b)
					if (a[b] == c) {
						a.splice(b, 1)
						break
					}
		}),
		K = (q.signal = function (a, b) {
			var c = a._handlers && a._handlers[b]
			if (c) for (var d = Array.prototype.slice.call(arguments, 2), e = 0; e < c.length; ++e) c[e].apply(null, d)
		}),
		Db = null,
		Hd = 30,
		Ae = (q.Pass = {
			toString: function () {
				return "CodeMirror.Pass"
			}
		}),
		ha = { scroll: !1 },
		kd = { origin: "*mouse" },
		Gb = { origin: "+move" }
	bb.prototype.set = function (a, b) {
		clearTimeout(this.id)
		this.id = setTimeout(b, a)
	}
	var aa = (q.countColumn = function (a, b, c, d, e) {
			null == b && ((b = a.search(/[^\s\u00a0]/)), -1 == b && (b = a.length))
			d = d || 0
			for (e = e || 0; ; ) {
				var f = a.indexOf("\t", d)
				if (0 > f || f >= b) return e + (b - d)
				e += f - d
				e += c - (e % c)
				d = f + 1
			}
		}),
		vc = [""],
		Za = function (a) {
			a.select()
		}
	Qa
		? (Za = function (a) {
				a.selectionStart = 0
				a.selectionEnd = a.value.length
		  })
		: B &&
		  (Za = function (a) {
				try {
					a.select()
				} catch (b) {}
		  })
	var rg = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,
		gf = (q.isWordChar = function (a) {
			return /\w/.test(a) || ("" < a && (a.toUpperCase() != a.toLowerCase() || rg.test(a)))
		}),
		ig =
			/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,
		Ea
	Ea = document.createRange
		? function (a, b, c, d) {
				var e = document.createRange()
				e.setEnd(d || a, c)
				e.setStart(a, b)
				return e
		  }
		: function (a, b, c) {
				var d = document.body.createTextRange()
				try {
					d.moveToElementText(a.parentNode)
				} catch (e) {
					return d
				}
				d.collapse(!0)
				d.moveEnd("character", c)
				d.moveStart("character", b)
				return d
		  }
	var Wc = (q.contains = function (a, b) {
		3 == b.nodeType && (b = b.parentNode)
		if (a.contains) return a.contains(b)
		do if ((11 == b.nodeType && (b = b.host), b == a)) return !0
		while ((b = b.parentNode))
	})
	B &&
		11 > C &&
		(fa = function () {
			try {
				return document.activeElement
			} catch (a) {
				return document.body
			}
		})
	var kb = (q.rmClass = function (a, b) {
			var c = a.className,
				d = Fb(b).exec(c)
			if (d) {
				var e = c.slice(d.index + d[0].length)
				a.className = c.slice(0, d.index) + (e ? d[1] + e : "")
			}
		}),
		mb = (q.addClass = function (a, b) {
			var c = a.className
			Fb(b).test(c) || (a.className += (c ? " " : "") + b)
		}),
		Dd = !1,
		Lf = (function () {
			if (B && 9 > C) return !1
			var a = t("div")
			return "draggable" in a || "dragDrop" in a
		})(),
		yd,
		vd,
		sa = (q.splitLines =
			3 != "\n\nb".split(/\n/).length
				? function (a) {
						for (var b = 0, c = [], d = a.length; b <= d; ) {
							var e = a.indexOf("\n", b)
							;-1 == e && (e = a.length)
							var f = a.slice(b, "\r" == a.charAt(e - 1) ? e - 1 : e),
								g = f.indexOf("\r")
							;-1 != g ? (c.push(f.slice(0, g)), (b += g + 1)) : (c.push(f), (b = e + 1))
						}
						return c
				  }
				: function (a) {
						return a.split(/\r\n?|\n/)
				  }),
		ng = window.getSelection
			? function (a) {
					try {
						return a.selectionStart != a.selectionEnd
					} catch (b) {
						return !1
					}
			  }
			: function (a) {
					try {
						var b = a.ownerDocument.selection.createRange()
					} catch (c) {}
					return b && b.parentElement() == a ? 0 != b.compareEndPoints("StartToEnd", b) : !1
			  },
		Ce = (function () {
			var a = t("div")
			if ("oncopy" in a) return !0
			a.setAttribute("oncopy", "return;")
			return "function" == typeof a.oncopy
		})(),
		bd = null,
		va = {
			3: "Enter",
			8: "Backspace",
			9: "Tab",
			13: "Enter",
			16: "Shift",
			17: "Ctrl",
			18: "Alt",
			19: "Pause",
			20: "CapsLock",
			27: "Esc",
			32: "Space",
			33: "PageUp",
			34: "PageDown",
			35: "End",
			36: "Home",
			37: "Left",
			38: "Up",
			39: "Right",
			40: "Down",
			44: "PrintScrn",
			45: "Insert",
			46: "Delete",
			59: ";",
			61: "\x3d",
			91: "Mod",
			92: "Mod",
			93: "Mod",
			107: "\x3d",
			109: "-",
			127: "Delete",
			173: "-",
			186: ";",
			187: "\x3d",
			188: ",",
			189: "-",
			190: ".",
			191: "/",
			192: "`",
			219: "[",
			220: "\\",
			221: "]",
			222: "'",
			63232: "Up",
			63233: "Down",
			63234: "Left",
			63235: "Right",
			63272: "Delete",
			63273: "Home",
			63275: "End",
			63276: "PageUp",
			63277: "PageDown",
			63302: "Insert"
		}
	q.keyNames = va
	;(function () {
		for (var a = 0; 10 > a; a++) va[a + 48] = va[a + 96] = String(a)
		for (a = 65; 90 >= a; a++) va[a] = String.fromCharCode(a)
		for (a = 1; 12 >= a; a++) va[a + 111] = va[a + 63235] = "F" + a
	})()
	var vb,
		gg = (function () {
			function a(a) {
				return 247 >= a
					? "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN".charAt(a)
					: 1424 <= a && 1524 >= a
					? "R"
					: 1536 <= a && 1773 >= a
					? "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm".charAt(a - 1536)
					: 1774 <= a && 2220 >= a
					? "r"
					: 8192 <= a && 8203 >= a
					? "w"
					: 8204 == a
					? "b"
					: "L"
			}
			function b(a, b, c) {
				this.level = a
				this.from = b
				this.to = c
			}
			var c = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,
				d = /[stwN]/,
				e = /[LRr]/,
				f = /[Lb1n]/,
				g = /[1n]/
			return function (h) {
				if (!c.test(h)) return !1
				for (var k = h.length, l = [], m = 0, p; m < k; ++m) l.push(a(h.charCodeAt(m)))
				for (var m = 0, n = "L"; m < k; ++m) (p = l[m]), "m" == p ? (l[m] = n) : (n = p)
				m = 0
				for (n = "L"; m < k; ++m) (p = l[m]), "1" == p && "r" == n ? (l[m] = "n") : e.test(p) && ((n = p), "r" == p && (l[m] = "R"))
				m = 1
				for (n = l[0]; m < k - 1; ++m) (p = l[m]), "+" == p && "1" == n && "1" == l[m + 1] ? (l[m] = "1") : "," != p || n != l[m + 1] || ("1" != n && "n" != n) || (l[m] = n), (n = p)
				for (m = 0; m < k; ++m)
					if (((p = l[m]), "," == p)) l[m] = "N"
					else if ("%" == p) {
						for (n = m + 1; n < k && "%" == l[n]; ++n);
						var q = (m && "!" == l[m - 1]) || (n < k && "1" == l[n]) ? "1" : "N"
						for (p = m; p < n; ++p) l[p] = q
						m = n - 1
					}
				m = 0
				for (n = "L"; m < k; ++m) (p = l[m]), "L" == n && "1" == p ? (l[m] = "L") : e.test(p) && (n = p)
				for (m = 0; m < k; ++m)
					if (d.test(l[m])) {
						for (n = m + 1; n < k && d.test(l[n]); ++n);
						p = "L" == (n < k ? l[n] : "L")
						q = "L" == (m ? l[m - 1] : "L") || p ? "L" : "R"
						for (p = m; p < n; ++p) l[p] = q
						m = n - 1
					}
				for (var n = [], r, m = 0; m < k; )
					if (f.test(l[m])) {
						p = m
						for (++m; m < k && f.test(l[m]); ++m);
						n.push(new b(0, p, m))
					} else {
						var t = m,
							q = n.length
						for (++m; m < k && "L" != l[m]; ++m);
						for (p = t; p < m; )
							if (g.test(l[p])) {
								t < p && n.splice(q, 0, new b(1, t, p))
								t = p
								for (++p; p < m && g.test(l[p]); ++p);
								n.splice(q, 0, new b(2, t, p))
								t = p
							} else ++p
						t < m && n.splice(q, 0, new b(1, t, m))
					}
				1 == n[0].level && (r = h.match(/^\s+/)) && ((n[0].from = r[0].length), n.unshift(new b(0, 0, r[0].length)))
				1 == A(n).level && (r = h.match(/\s+$/)) && ((A(n).to -= r[0].length), n.push(new b(0, k - r[0].length, k)))
				2 == n[0].level && n.unshift(new b(1, n[0].to, n[0].to))
				n[0].level != A(n).level && n.push(new b(n[0].level, k, k))
				return n
			}
		})()
	q.version = "5.2.0"
	return q
})
